আমি একটি তারিখের সীমাটি কীভাবে লুপ করব?


197

আমি লুপ / ​​কাউন্টার ধরণের সমাধানের জন্য কিছু ভয়ঙ্কর ব্যবহার না করে এটি কীভাবে করব তাও নিশ্চিত নই। সমস্যাটি এখানে:

আমাকে দুটি তারিখ দেওয়া হয়েছে, একটি শুরুর তারিখ এবং শেষের তারিখ এবং একটি নির্দিষ্ট বিরতিতে আমাকে কিছু পদক্ষেপ নেওয়া দরকার। উদাহরণস্বরূপ: প্রতি তৃতীয় দিন 3/26/2009 অবধি 3/10/2009 এর মধ্যে প্রতি তারিখের জন্য আমাকে একটি তালিকায় একটি এন্ট্রি তৈরি করতে হবে। সুতরাং আমার ইনপুটগুলি হবে:

DateTime StartDate = "3/10/2009";
DateTime EndDate = "3/26/2009";
int DayInterval = 3;

এবং আমার আউটপুট একটি তালিকা হবে যা নিম্নলিখিত তারিখগুলি রয়েছে:

3/13/2009 3/16/2009 3/19/2009 3/22/2009 3/25/2009

তাহলে কীভাবে আমি এইরকম কিছু করব? আমি এমন একটি লুপ ব্যবহার করার কথা ভেবেছিলাম যা প্রতিদিনের মধ্যে এইরকম পৃথক কাউন্টার সহ বিস্তৃত হয়:

int count = 0;

for(int i = 0; i < n; i++)
{
     count++;
     if(count >= DayInterval)
     {
          //take action
          count = 0;
     }

}

তবে মনে হয় এর চেয়ে ভাল উপায় আর কি হতে পারে?


1
আমি অনুমান করব যে সি # এর তারিখগুলির জন্য একটি ডেটা কাঠামো রয়েছে যা আপনি ব্যবহার করতে পারেন।
আনা

উত্তর:


470

ঠিক আছে, আপনাকে এগুলির একটি বা অন্য উপায়ে লুপ করতে হবে। আমি এই জাতীয় পদ্ধতির সংজ্ঞা দিতে পছন্দ করি:

public IEnumerable<DateTime> EachDay(DateTime from, DateTime thru)
{
    for(var day = from.Date; day.Date <= thru.Date; day = day.AddDays(1))
        yield return day;
}

তারপরে আপনি এটি ব্যবহার করতে পারেন:

foreach (DateTime day in EachDay(StartDate, EndDate))
    // print it or whatever

এই পদ্ধতিতে আপনি প্রতিটি অন্যান্য দিন, প্রতি তৃতীয় দিন, কেবল সপ্তাহের দিনগুলি ইত্যাদিতে হিট করতে পারেন উদাহরণস্বরূপ, "শুরুর" তারিখের সাথে শুরু করে প্রতি তৃতীয় দিন ফিরে আসার জন্য, আপনি কেবল AddDays(3)লুপের পরিবর্তে কল করতে পারেন AddDays(1)


18
এমনকি অন্তরালের জন্য আপনি আরও একটি প্যারামিটার যুক্ত করতে পারেন।
জাস্টিন ড্রুরি 15

এটি প্রথম তারিখ সহ অন্তর্ভুক্ত থাকবে। আপনি যদি এটি না চান তবে কেবল 'var day = from.Date' থেকে 'var day = from.Date.AddDays (dayInterval)' পরিবর্তন করুন
SwDevMan81

3
একটি আকর্ষণীয় এবং বাস্তব শব্দ সমস্যার জন্য সত্যিই দুর্দান্ত সমাধান। আমি পছন্দ করি এটি কীভাবে ভাষার বেশ কয়েকটি দরকারী কৌশল দেখায়। এবং এটি আমাকে স্মরণ করিয়ে দেয় যে লুপটি কেবলমাত্র (int i = 0; ...) () এর জন্য নয়
অড্রুয়াস

9
এটি ডেটটাইম পর্যন্ত একটি এক্সটেনশন পদ্ধতি তৈরি করা এটি আরও উন্নত করতে পারে।
ম্যাটস

1
দিন এবং মাসের জন্য এক্সটেনশনের জন্য আমার উত্তরটি দেখুন;) কেবল আপনার সন্তুষ্টির জন্য: ডি
জ্যাকব সোবাস

31

আমার মিস্কিল একটি Rangeক্লাস আছে যা আপনি দরকারী খুঁজে পেতে পারেন। বিভিন্ন এক্সটেনশন পদ্ধতির সাথে সম্মিলিত, আপনি এটি করতে পারেন:

foreach (DateTime date in StartDate.To(EndDate).ExcludeEnd()
                                   .Step(DayInterval.Days())
{
    // Do something with the date
}

(আপনি শেষটি বাদ দিতে পারেন বা নাও করতে পারেন - আমি কেবল ভেবেছিলাম এটি একটি উদাহরণ হিসাবে সরবরাহ করব))

এটি মূলত ম্যাকান্ডারের দ্রবণের একটি প্রস্তুত-রোলড (এবং আরও সাধারণ-উদ্দেশ্য) ফর্ম।


2
আপনি অবশ্যই এ জাতীয় জিনিসগুলি এক্সটেনশন পদ্ধতিতে পছন্দ করেন কিনা তা অবশ্যই স্বাদের বিষয়। ExcludeEnd()এটা সুন্দর.
এমকিপিপি

আপনি অবশ্যই এক্সটেনশন পদ্ধতিগুলি ব্যবহার না করে সেগুলি করতে পারেন। আইএমও পড়তে এটি কেবল অনেক কুশল এবং শক্ত হবে :)
জন স্কিটি

1
বাহ - মিস্কিটিল কী দুর্দান্ত রিসোর্স - আপনার উত্তরের জন্য ধন্যবাদ!
এককিডনি

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

23

আপনার উদাহরণের জন্য আপনি চেষ্টা করতে পারেন

DateTime StartDate = new DateTime(2009, 3, 10);
DateTime EndDate = new DateTime(2009, 3, 26);
int DayInterval = 3;

List<DateTime> dateList = new List<DateTime>();
while (StartDate.AddDays(DayInterval) <= EndDate)
{
   StartDate = StartDate.AddDays(DayInterval);
   dateList.Add(StartDate);
}

1
এটাই আমি ভাবছিলাম (যদিও আমি উপরেও ম্যাকান্ডারের উত্তর পছন্দ করি) তবে আপনি কীভাবে একটি দুর্দান্ত কোড নমুনা এত তাড়াতাড়ি পোস্ট করবেন তা আমি বুঝতে পারি না!
TLiebe

3
আমি মনে করি আমাদের স্টার্টডেট.এডডয়েস (ডে-ইন্টেরওয়াল) দরকার; একবার এই লুপে দুবার নয়।
আব্দুল সবুর

15

@ এমকান্ডার এবং @ দই দ্য ওয়াইস থেকে কোড এক্সটেনশনে ব্যবহৃত:

public static IEnumerable<DateTime> EachDay(DateTime from, DateTime thru)
{
    for (var day = from.Date; day.Date <= thru.Date; day = day.AddDays(1))
        yield return day;
}

public static IEnumerable<DateTime> EachMonth(DateTime from, DateTime thru)
{
    for (var month = from.Date; month.Date <= thru.Date || month.Month == thru.Month; month = month.AddMonths(1))
        yield return month;
}

public static IEnumerable<DateTime> EachDayTo(this DateTime dateFrom, DateTime dateTo)
{
    return EachDay(dateFrom, dateTo);
}

public static IEnumerable<DateTime> EachMonthTo(this DateTime dateFrom, DateTime dateTo)
{
    return EachMonth(dateFrom, dateTo);
}

মানেটা কি এমন EachDayToএবং EachMonthTo? আমি মনে করি আমি এখানে কিছু মিস করেছি।
অ্যালিসন

@ এলিসন সেগুলি হ'ল তারিখের কাজ থেকে শুরু করা এক্সটেনশন পদ্ধতি :) তাই আপনি এগুলি ইতিমধ্যে তৈরি ডেটটাইম অবজেক্টগুলিতে আরও সাবলীল ব্যবহার করতে পারেন (উদাহরণস্বরূপ। উদাহরণস্বরূপ)। এক্সটেনশন পদ্ধতি সম্পর্কে আরও এখানে: ডকস.মাইক্রোসফট
জ্যাকব সোবাস

8
DateTime startDate = new DateTime(2009, 3, 10);
DateTime stopDate = new DateTime(2009, 3, 26);
int interval = 3;

for (DateTime dateTime=startDate;
     dateTime < stopDate; 
     dateTime += TimeSpan.FromDays(interval))
{

}

8

1 বছর পরে, এটি কাউকে সাহায্য করতে পারে,

আরও নমনীয় হওয়ার জন্য এই সংস্করণটিতে একটি শিকারী রয়েছে ।

ব্যবহার

var today = DateTime.UtcNow;
var birthday = new DateTime(2018, 01, 01);

আমার জন্মদিনে প্রতিদিন

var toBirthday = today.RangeTo(birthday);  

আমার জন্মদিনে মাসিক, 2 মাস

var toBirthday = today.RangeTo(birthday, x => x.AddMonths(2));

আমার জন্মদিনে বার্ষিক

var toBirthday = today.RangeTo(birthday, x => x.AddYears(1));

RangeFromপরিবর্তে ব্যবহার করুন

// same result
var fromToday = birthday.RangeFrom(today);
var toBirthday = today.RangeTo(birthday);

বাস্তবায়ন

public static class DateTimeExtensions 
{

    public static IEnumerable<DateTime> RangeTo(this DateTime from, DateTime to, Func<DateTime, DateTime> step = null)
    {
        if (step == null)
        {
            step = x => x.AddDays(1);
        }

        while (from < to)
        {
            yield return from;
            from = step(from);
        }
    }

    public static IEnumerable<DateTime> RangeFrom(this DateTime to, DateTime from, Func<DateTime, DateTime> step = null)
    {
        return from.RangeTo(to, step);
    }
}

অতিরিক্ত

আপনি যদি একটি ব্যতিক্রম ছুঁড়ে ফেলতে পারেন fromDate > toDateতবে আমি তার পরিবর্তে একটি খালি রেঞ্জকে ফিরিয়ে দিতে পছন্দ করি[]


বাহ - এটি সত্যিই ব্যাপক। ধন্যবাদ আহমদ!
এককিডনি

3
DateTime startDate = new DateTime(2009, 3, 10);
DateTime stopDate = new DateTime(2009, 3, 26);
int interval = 3;

while ((startDate = startDate.AddDays(interval)) <= stopDate)
{
    // do your thing
}

মনে রাখবেন যে এটিতে শুরু করার তারিখটি অন্তর্ভুক্ত নয়, যেহেতু এটি প্রথম দিন whileরান করার জন্য একটি দিন যোগ করে ।
জন ওয়াশাম

2

সমস্যা অনুসারে আপনি এটি চেষ্টা করতে পারেন ...

// looping between date range    
while (startDate <= endDate)
{
    //here will be your code block...

    startDate = startDate.AddDays(1);
}

ধন্যবাদ ......


2
DateTime begindate = Convert.ToDateTime("01/Jan/2018");
DateTime enddate = Convert.ToDateTime("12 Feb 2018");
 while (begindate < enddate)
 {
    begindate= begindate.AddDays(1);
    Console.WriteLine(begindate + "  " + enddate);
 }

1

পরিবর্তে আপনি একটি পুনরুক্তি লেখার কথা বিবেচনা করতে পারেন, যা আপনাকে '++' এর মতো লুপ সিনট্যাক্সের জন্য 'সাধারণ' ব্যবহার করতে দেয়। আমি স্ট্যাকওভারফ্লোতে উত্তর এবং অনুরূপ প্রশ্নের উত্তর খুঁজে পেয়েছি যা ডেটটাইম পুনরাবৃত্ত করার জন্য পয়েন্টার দেয়।


1

আপনি ব্যবহার করতে পারেন DateTime.AddDays()আপনার যোগ করার জন্য ফাংশন DayIntervalথেকে StartDateএবং এটি কম নিশ্চিত করতে পরীক্ষা EndDate


0

আপনাকে এখানে সতর্কতা অবলম্বন করতে হবে যে লুপগুলিতে আরও ভাল সমাধান হতে পারে তখন তারিখগুলি মিস করবেন না।

এটি আপনাকে সূচনার তারিখের প্রথম তারিখ দেয় এবং এটি বৃদ্ধি করার আগে এটি লুপে ব্যবহার করে এবং এটি শেষ তারিখের শেষ তারিখ সহ সমস্ত তারিখ প্রক্রিয়া করবে <= শেষ তারিখ।

সুতরাং উপরের উত্তরটি সঠিক উত্তর।

while (startdate <= enddate)
{
    // do something with the startdate
    startdate = startdate.adddays(interval);
}

0

আপনি এটি ব্যবহার করতে পারেন।

 DateTime dt0 = new DateTime(2009, 3, 10);
 DateTime dt1 = new DateTime(2009, 3, 26);

 for (; dt0.Date <= dt1.Date; dt0=dt0.AddDays(3))
 {
    //Console.WriteLine(dt0.Date.ToString("yyyy-MM-dd"));
    //take action
 }

এটা সত্যিই সংহত। নিস!
এককিডনি

0

প্রতি 15 মিনিটে ইটারেট করুন

DateTime startDate = DateTime.Parse("2018-06-24 06:00");
        DateTime endDate = DateTime.Parse("2018-06-24 11:45");

        while (startDate.AddMinutes(15) <= endDate)
        {

            Console.WriteLine(startDate.ToString("yyyy-MM-dd HH:mm"));
            startDate = startDate.AddMinutes(15);
        }

0

@ জ্যাকব-সোবাস এবং @ ম্যাকান্দার এবং @ দই ঠিক সঠিক নয় .. পরের দিন যদি আমার প্রয়োজন হয় তবে আমি বেশিরভাগ সময় 00:00 অপেক্ষা করি

    public static IEnumerable<DateTime> EachDay(DateTime from, DateTime thru)
    {
        for (var day = from.Date; day.Date <= thru.Date; day = day.NextDay())
            yield return day;
    }

    public static IEnumerable<DateTime> EachMonth(DateTime from, DateTime thru)
    {
        for (var month = from.Date; month.Date <= thru.Date || month.Year == thru.Year && month.Month == thru.Month; month = month.NextMonth())
            yield return month;
    }

    public static IEnumerable<DateTime> EachYear(DateTime from, DateTime thru)
    {
        for (var year = from.Date; year.Date <= thru.Date || year.Year == thru.Year; year = year.NextYear())
            yield return year;
    }

    public static DateTime NextDay(this DateTime date)
    {
        return date.AddTicks(TimeSpan.TicksPerDay - date.TimeOfDay.Ticks);
    }

    public static DateTime NextMonth(this DateTime date)
    {
        return date.AddTicks(TimeSpan.TicksPerDay * DateTime.DaysInMonth(date.Year, date.Month) - (date.TimeOfDay.Ticks + TimeSpan.TicksPerDay * (date.Day - 1)));
    }

    public static DateTime NextYear(this DateTime date)
    {
        var yearTicks = (new DateTime(date.Year + 1, 1, 1) - new DateTime(date.Year, 1, 1)).Ticks;
        var ticks = (date - new DateTime(date.Year, 1, 1)).Ticks;
        return date.AddTicks(yearTicks - ticks);
    }

    public static IEnumerable<DateTime> EachDayTo(this DateTime dateFrom, DateTime dateTo)
    {
        return EachDay(dateFrom, dateTo);
    }

    public static IEnumerable<DateTime> EachMonthTo(this DateTime dateFrom, DateTime dateTo)
    {
        return EachMonth(dateFrom, dateTo);
    }

    public static IEnumerable<DateTime> EachYearTo(this DateTime dateFrom, DateTime dateTo)
    {
        return EachYear(dateFrom, dateTo);
    }

0

এখানে 2020 সালে আমার 2 সেন্ট।

Enumerable.Range(0, (endDate - startDate).Days + 1)
.ToList()
.Select(a => startDate.AddDays(a));

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