তারিখ সময় - পরের মঙ্গলবার পান


154

আমি কিভাবে আগামী মঙ্গলবার তারিখ পেতে পারি?

পিএইচপি-তে এটি যতটা সহজ strtotime('next tuesday');

কীভাবে। নেট এ অনুরূপ কিছু অর্জন করতে পারি


15
এএসপি.এনইটি ওয়েব প্রযুক্তির একটি সেট। সি # একটি ভাষা। আপনাকে সরল .NET- র ক্ষেত্রে সত্যই এটি ভাবতে হবে। এখন, "পরের মঙ্গলবার" - এটাই কি "আজকের পরে প্রথম মঙ্গলবার"? যদি এটি সোমবার হয় এবং কেউ বলেছিলেন "আগামী মঙ্গলবার আপনার সাথে দেখা হবে" আমি আশা করব যে এটি 1 এর পরিবর্তে 8 দিনের সময় হবে today আজ মঙ্গলবার হলে কী হবে? দিনের কোন সময় আপনার দরকার?
জন স্কিটি

আজ যদি মঙ্গলবার হয় তবে আপনি আগামী মঙ্গলবার কখন তারিখটি সন্ধান করতে চান? অথবা আজ সোমবার, আপনি সোমবার থেকে দ্বিতীয় মঙ্গলবার সন্ধান করতে চান?
আগুনের পান্ডা

নিকটতম মঙ্গলবার এগিয়ে চলেছে যা এটি কখনও বিশেষ দিন day
ব্রেঞ্জট

2
@ ব্রেঞ্জটএল: এবং যদি এটি ইতিমধ্যে মঙ্গলবার হয়?
জন স্কিটি

যদি ইতিমধ্যে মঙ্গলবার হয় তবে একই দিন
ব্রেঞ্জট

উত্তর:


371

আমি মন্তব্যে যেমন উল্লেখ করেছি, "পরের মঙ্গলবার" বলতে আপনি বোঝাতে পারেন এমন বিভিন্ন জিনিস রয়েছে তবে এই কোডটি আপনাকে "পরবর্তী মঙ্গলবার ঘটতে বা আজ ইতিমধ্যে মঙ্গলবার হলে" দেয়:

DateTime today = DateTime.Today;
// The (... + 7) % 7 ensures we end up with a value in the range [0, 6]
int daysUntilTuesday = ((int) DayOfWeek.Tuesday - (int) today.DayOfWeek + 7) % 7;
DateTime nextTuesday = today.AddDays(daysUntilTuesday);

ইতিমধ্যে মঙ্গলবার যদি আপনি "এক সপ্তাহের সময়" দিতে চান তবে আপনি এটি ব্যবহার করতে পারেন:

// This finds the next Monday (or today if it's Monday) and then adds a day... so the
// result is in the range [1-7]
int daysUntilTuesday = (((int) DayOfWeek.Monday - (int) today.DayOfWeek + 7) % 7) + 1;

... বা আপনি আসল সূত্রটি ব্যবহার করতে পারেন তবে আগামীকাল থেকে:

DateTime tomorrow = DateTime.Today.AddDays(1);
// The (... + 7) % 7 ensures we end up with a value in the range [0, 6]
int daysUntilTuesday = ((int) DayOfWeek.Tuesday - (int) tomorrow.DayOfWeek + 7) % 7;
DateTime nextTuesday = tomorrow.AddDays(daysUntilTuesday);

সম্পাদনা: কেবল এই সুন্দর এবং বহুমুখী করতে:

public static DateTime GetNextWeekday(DateTime start, DayOfWeek day)
{
    // The (... + 7) % 7 ensures we end up with a value in the range [0, 6]
    int daysToAdd = ((int) day - (int) start.DayOfWeek + 7) % 7;
    return start.AddDays(daysToAdd);
}

সুতরাং "আজ বা পরবর্তী 6 দিনের মধ্যে" এর মান পেতে:

DateTime nextTuesday = GetNextWeekday(DateTime.Today, DayOfWeek.Tuesday);

"আজ বাদে আগামী মঙ্গলবার" এর মান পেতে:

DateTime nextTuesday = GetNextWeekday(DateTime.Today.AddDays(1), DayOfWeek.Tuesday);

বাহ, আমি ঠিক ভাবছিলাম যে আমি আগামী মঙ্গলবার পর্যন্ত কীভাবে নবম দিন পেতে পারি এবং আপনি তার উত্তরে একটি চমৎকার উদাহরণ দিয়ে উত্তরটি আপডেট করেছেন? ধন্যবাদ
ব্রেঞ্জট

সঠিক উত্তরটি নির্বাচন করা কঠিন ছিল। তবে আপনারটিকে সবচেয়ে বহুমুখী বলে মনে হচ্ছে এবং আপনি এটি বুঝতে সহজ করেছেন understand আপনার সহযোগিতার জন্য ধন্যবাদ.
ব্রেঞ্জট

1
@ ব্রেনেজট: আসলে আমি বলব যে সুইভেন এর চেয়ে বেশি বহুমুখী, আপনি যেমন সপ্তাহের দিনটি নির্দিষ্ট করতে পারেন তবে এটিই আপনার কল :) (আমি এখন আরও সাধারণীকৃত সংস্করণ দেওয়ার জন্য আমার সম্পাদনা করেছি।)
জোন স্কিট

1
+7)%7সমাধান যদিও প্রশংসনীয় সুন্দর। যদিও আমি এটি ব্যবহার না করেছিলাম কারণ এটি কিছুটা মাইক্রো-অপটিমাইজেশন এবং খুব সহজেই ভুল হতে পারে (পাশাপাশি কিছু পাঠযোগ্যতার ত্যাগও করা হচ্ছে), অবশ্যই।
সোভেন

একটি ইউনিট পরীক্ষা: [টেস্টমেথড] পাবলিক অকার্যকর হোল্ডগেটনেক্সটস্যাটারডে () now var এখন = ডেটটাইম.নো; var পরীক্ষা = getNextWeekday (তারিখটাইম.টোডে, DayOfWeek.Sat शनिवार); Assert.IsTrue (now.Day <test.Day, "প্রত্যাশিত মাসের দিনটি এখানে নেই।"); দ্য রিপোর্ট Assert.IsTrue ((test.Day - now.Day) <7, "প্রত্যাশিত দিনের ব্যবধান এখানে নেই" "); }
রাসেক্স

67

এই কৌতুক করতে হবে:

static DateTime GetNextWeekday(DayOfWeek day)
{
    DateTime result = DateTime.Now.AddDays(1);
    while( result.DayOfWeek != day )
        result = result.AddDays(1);
    return result;
}

দুর্দান্ত প্রতিক্রিয়া, আজ মঙ্গলবার হলে (যা এটি হা) এটি কি আজ বা পরের মঙ্গলবার ফিরে আসবে?
ব্রেঞ্জট

3
এটি পরের মঙ্গলবার ফিরে আসবে। আপনি যদি আজ এটি ফিরে আসতে চান, কেবল .AddDays(1)প্রথম লাইনটি থেকে সরিয়ে দিন , সেভাবে এটি নিজেও পরীক্ষা DateTime.Nowকরে দেখবে ।
সোভেন

7

এই সমস্যাটির জন্য কম ভার্বোস এবং আরও চতুর / মার্জিত সমাধান রয়েছে তবে নিম্নলিখিত সি # ফাংশনটি বেশ কয়েকটি পরিস্থিতির জন্য সত্যই কার্যকরভাবে কাজ করে।

/// <summary>
/// Find the closest weekday to the given date
/// </summary>
/// <param name="includeStartDate">if the supplied date is on the specified day of the week, return that date or continue to the next date</param>
/// <param name="searchForward">search forward or backward from the supplied date. if a null parameter is given, the closest weekday (ie in either direction) is returned</param>
public static DateTime ClosestWeekDay(this DateTime date, DayOfWeek weekday, bool includeStartDate = true, bool? searchForward=true)
{
    if (!searchForward.HasValue && !includeStartDate) 
    {
        throw new ArgumentException("if searching in both directions, start date must be a valid result");
    }
    var day = date.DayOfWeek;
    int add = ((int)weekday - (int)day);
    if (searchForward.HasValue)
    {
        if (add < 0 && searchForward.Value)
        {
            add += 7;
        }
        else if (add > 0 && !searchForward.Value)
        {
            add -= 7;
        }
        else if (add == 0 && !includeStartDate)
        {
            add = searchForward.Value ? 7 : -7;
        }
    }
    else if (add < -3) 
    {
        add += 7; 
    }
    else if (add > 3)
    {
        add -= 7;
    }
    return date.AddDays(add);
}

1
তারিখটাইমকে এক্সটেনশন হিসাবে প্রয়োগ করে এমন একমাত্র উত্তর। অন্যান্য সমাধানগুলি সমস্ত কাজ করার সময়, এটি একটি এক্সটেনশন পদ্ধতি হিসাবে থাকা কোড ব্যবহার করা সহজতর উত্পাদন করে।
রায়ান ম্যাকআর্থার

5
DateTime nextTuesday = DateTime.Today.AddDays(((int)DateTime.Today.DayOfWeek - (int)DayOfWeek.Tuesday) + 7);

আজ যদি সোমবার হয় তবে আপনি যে উত্তরটি দিয়েছেন তা আগামীকাল নয় বরং মঙ্গলবার থেকে এক সপ্তাহের মধ্যে আসে।
টনি

5

@ জোন স্কিট ভাল উত্তর।

আগের দিনের জন্য:

private DateTime GetPrevWeekday(DateTime start, DayOfWeek day) {
    // The (... - 7) % 7 ensures we end up with a value in the range [0, 6]
    int daysToRemove = ((int) day - (int) start.DayOfWeek - 7) % 7;
    return start.AddDays(daysToRemove);
}

ধন্যবাদ !!


নোট করুন যে এই সমাধানটিতে মডুলো অপারেটরের হাতে দেওয়া নেতিবাচক সংখ্যা জড়িত। ফরম অপারেটরের সম্পর্কে Wikipedia নিবন্ধটি বলছেন যে "যখন হয় একটি বা n নেতিবাচক, নিচে এবং প্রোগ্রামিং ভাষায় কিভাবে এই মান সংজ্ঞায়িত করা হয় পার্থক্য সাদাসিধা সংজ্ঞা বিরতি হয়।" এটি সম্ভবত সি # তে কাজ করার সময়, একই ফলাফল পাওয়ার জন্য একটি গাণিতিকভাবে আরও 'কঠিন' সমাধানটি এর DayOfWeekমতো মানগুলি অদলবদল করতে পারে :int daysToSubtract = -(((int)dateTime.DayOfWeek - (int)day + 7) % 7);
আন্দ্রে

4
DateTime nexttuesday=DateTime.Today.AddDays(1);

while(nexttuesday.DayOfWeek!=DayOfWeek.Tuesday)
   nexttuesday = nexttuesday.AddDays(1);

3

বর্তমান তারিখটি অন্তর্ভুক্ত বা বাদ দেওয়ার জন্য খুব সাধারণ নমুনা, আপনি যে সপ্তাহে আগ্রহী সেটির তারিখ এবং দিনটি নির্দিষ্ট করেন।

public static class DateTimeExtensions
{
    /// <summary>
    /// Gets the next date.
    /// </summary>
    /// <param name="date">The date to inspected.</param>
    /// <param name="dayOfWeek">The day of week you want to get.</param>
    /// <param name="exclDate">if set to <c>true</c> the current date will be excluded and include next occurrence.</param>
    /// <returns></returns>
    public static DateTime GetNextDate(this DateTime date, DayOfWeek dayOfWeek, bool exclDate = true)
    {
        //note: first we need to check if the date wants to move back by date - Today, + diff might move it forward or backwards to Today
        //eg: date - Today = 0 - 1 = -1, so have to move it forward
        var diff = dayOfWeek - date.DayOfWeek;
        var ddiff = date.Date.Subtract(DateTime.Today).Days + diff;

        //note: ddiff < 0 : date calculates to past, so move forward, even if the date is really old, it will just move 7 days from date passed in
        //note: ddiff >= (exclDate ? 6 : 7) && diff < 0 : date is into the future, so calculated future weekday, based on date
        if (ddiff < 0 || ddiff >= (exclDate ? 6 : 7) && diff < 0)
            diff += 7; 

        //note: now we can get safe values between 0 - 6, especially if past dates is being used
        diff = diff % 7;

        //note: if diff is 0 and we are excluding the date passed, we will add 7 days, eg: 1 week
        diff += diff == 0 & exclDate ? 7 : 0;

        return date.AddDays(diff);
    }
}

কিছু পরীক্ষার ক্ষেত্রে

[TestMethod]
    public void TestNextDate()
    {
        var date = new DateTime(2013, 7, 15);
        var start = date;
        //testing same month - forwardOnly
        Assert.AreEqual(start = start.AddDays(1), date.GetNextDate(DayOfWeek.Tuesday)); //16
        Assert.AreEqual(start = start.AddDays(1), date.GetNextDate(DayOfWeek.Wednesday)); //17
        Assert.AreEqual(start = start.AddDays(1), date.GetNextDate(DayOfWeek.Thursday)); //18
        Assert.AreEqual(start = start.AddDays(1), date.GetNextDate(DayOfWeek.Friday)); //19
        Assert.AreEqual(start = start.AddDays(1), date.GetNextDate(DayOfWeek.Saturday)); //20
        Assert.AreEqual(start = start.AddDays(1), date.GetNextDate(DayOfWeek.Sunday)); //21
        Assert.AreEqual(start.AddDays(1), date.GetNextDate(DayOfWeek.Monday)); //22

        //testing same month - include date
        Assert.AreEqual(start = date, date.GetNextDate(DayOfWeek.Monday, false)); //15
        Assert.AreEqual(start = start.AddDays(1), date.GetNextDate(DayOfWeek.Tuesday, false)); //16
        Assert.AreEqual(start.AddDays(1), date.GetNextDate(DayOfWeek.Wednesday, false)); //17

        //testing month change - forwardOnly
        date = new DateTime(2013, 7, 29);
        start = date;
        Assert.AreEqual(start = start.AddDays(1), date.GetNextDate(DayOfWeek.Tuesday)); //30
        Assert.AreEqual(start = start.AddDays(1), date.GetNextDate(DayOfWeek.Wednesday)); //31
        Assert.AreEqual(start = start.AddDays(1), date.GetNextDate(DayOfWeek.Thursday)); //2013/09/01-month increased
        Assert.AreEqual(start.AddDays(1), date.GetNextDate(DayOfWeek.Friday)); //02

        //testing year change
        date = new DateTime(2013, 12, 30);
        start = date;
        Assert.AreEqual(start = start.AddDays(1), date.GetNextDate(DayOfWeek.Tuesday)); //31
        Assert.AreEqual(start = start.AddDays(1), date.GetNextDate(DayOfWeek.Wednesday)); //2014/01/01 - year increased
        Assert.AreEqual(start = start.AddDays(1), date.GetNextDate(DayOfWeek.Thursday)); //02
    }

আমি কিছু বিস্তৃত পরীক্ষার পরে মূল উত্তর থেকে অতিরিক্ত পরিবর্তন করেছি। এটি এখন ব্যবহৃত তারিখ, অতীত, বর্তমান এবং ভবিষ্যতের ভিত্তিতে পরের দিন নিরাপদে গণনা করবে। পূর্ববর্তী সমস্ত উদাহরণ যেখানে দুর্দান্ত তবে নির্দিষ্ট শর্তে ব্যর্থ হয়েছে। আমি এটিকে ওয়ান-লাইনারের বিবৃতি তৈরি করি নি, যাতে গণনাগুলি কী করছে তার অতিরিক্ত মন্তব্য করা যায়। জন স্কিটির ইতিবাচক ক্ষেত্রে দুর্দান্ত ছিল, যদিও আমার যে কেসটি ছিল তা ছিল একটি তারিখ থেকে 1 দিন পিছনে সরানো, তবে আজকের চেয়েও বড়, এবং যদি এটি আজ বা গতকালে চলে যায় ... এটি এটিকে সমাধান করেছে।
এজেবি

1

এটি একটি এক্সটেনশনও হতে পারে, এটি সব নির্ভর করে

public static class DateTimeExtensions
{
    public static IEnumerable<DateTime> Next(this DateTime date, DayOfWeek day)
    {
        // This loop feels expensive and useless, but the point is IEnumerable
        while(true)
        {
            if (date.DayOfWeek == day)
            {
                yield return date;
            }
            date = date.AddDays(1);
        }
    }
}

ব্যবহার

    var today = DateTime.Today;
    foreach(var monday in today.Next(DayOfWeek.Monday))
    {
        Console.WriteLine(monday);
        Console.ReadKey();
    }

0

এখন অনেলিয়ার স্বাদে - যদি আপনাকে কোনও ব্যবস্থায় প্যারামিটার হিসাবে পাস করতে হয় তবে।

DateTime.Now.AddDays(((int)yourDate.DayOfWeek - (int)DateTime.Now.DayOfWeek + 7) % 7).Day

এই নির্দিষ্ট ক্ষেত্রে:

DateTime.Now.AddDays(((int)DayOfWeek.Tuesday - (int)DateTime.Now.DayOfWeek + 7) % 7).Day

-5

উদ্দেশ্য সি সংস্করণ:

+(NSInteger) daysUntilNextWeekday: (NSDate*)startDate withTargetWeekday: (NSInteger) targetWeekday
{
    NSInteger startWeekday = [[NSCalendar currentCalendar] component:NSCalendarUnitWeekday fromDate:startDate];
    return (targetWeekday - startWeekday + 7) % 7;
}

4
দুর্দান্ত উত্তর, তবে মূল প্রশ্নটি। নেট সম্পর্কে জিজ্ঞাসা করা হয়েছে।
অ্যাডাম ডেভিস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.