我如何循环浏览date范围?

我甚至不知道如何做到这一点,而不使用一些可怕的循环/计数器types的解决scheme。 这是问题:

我给了两个date,开始date和结束date,并在指定的时间间隔,我需要采取一些行动。 例如:2009年3月10日前的每个date,直到2009年3月26日,每隔三天,我需要在列表中创build一个条目。 所以我的投入是:

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

和我的输出将是一个列表,具有以下date:

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

那么我会怎么做呢? 我想过使用for循环,每隔一段时间在一个单独的计数器之间循环,如下所示:

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

但似乎有更好的办法?

那么,你需要以某种方式循环它们。 我更喜欢定义一个像这样的方法:

 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) “开始”date开始,每隔三天返回一次,您可以在循环中调用AddDays(3)而不是AddDays(1)

我有一个在MiscUtil中的Range类,你可以find有用的。 结合各种扩展方法,你可以这样做:

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

(你可能想也可能不想排除这个结局 – 我只是想把它作为一个例子。)

这基本上是mQuander解决scheme的一种现成的(更通用的)forms。

对于你的例子,你可以尝试

 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); } 

@mquander和@Yogurt的代码扩展中使用的Wise:

 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); } 
 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)) { } 
 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 } 

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 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); } } 

附加function

你可以抛出一个exception,如果fromDate > toDate ,但我更喜欢返回一个空的范围,而不是[]

根据这个问题,你可以试试这个…

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

谢谢……

你可能会考虑编写一个迭代器,它允许你使用普通的'for'循环语法,比如'++'。 我search了一下,在StackOverflow上find了一个类似的问题,它给出了使DateTime迭代的指针。

您可以使用DateTime.AddDays()函数将您的DayInterval添加到StartDate并检查以确保它小于EndDate

你必须小心谨慎,不要错过在循环中更好的解决scheme。

这会给你startdate的第一个date,并在循环中使用它,然后它会处理所有date,包括enddate的最后date,因此<= enddate。

所以上面的答案是正确的。

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