easy way to loop over months and years from a given date
我一直在尝试编写这个循环,但它却变得越来越复杂。基本上,我想取一个给定的日期,每个月循环一次,直到我到达当前的月份。所以如果开始日期是2011年11月1日,那么我想循环通过
2011年11月、2011年12月、2012年1月、2012年2月等
这是我刚开始做的,但这行不通。一旦我到了新年,我就需要从1开始,而不是从startdate.month。一般来说,有没有更好的方法可以循环使用数月和数年?谢谢
1 2 3 4 5 6 7 | for (var y = startdate.Year; y <= DateTime.Now.Year; y++) { for (var m = startdate.Month; m <= 12; m++) { //do something with m and y } } |
1 2 3 4 5 | Date target = new Date(2011, 4, 1); while (target < Date.Today) { // do something with target.Month and target.Year target = target.AddMonths(1); } |
1 2 3 4 5 | DateTime endDate = DateTime.Today; for (DateTime dt = startDate; dt <= endDate; dt = dt.AddMonths(1)) { Console.WriteLine("{0:M/yyyy}", dt); } |
但如果你更喜欢简单的while循环的话,那将是我的丹-。。。。。。。。。。。。。。的:)
这将在一个环的和将不会是一个问题。
1 2 3 4 5 6 7 8 | var date = startDate; var endDate = DateTime.Now; while(date.Year < endDate.Year || (date.Year == endDate.Year && date.Month <= endDate.Month)) { Console.WriteLine($"{date.Month}/{date.Year}"); date = date.AddMonths(1); } |
数范围(IEnumerable的一天"的时间)本月在给定的日期):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | from range in new[] { new { start = new DateTime(2017, 6, 23), end = new DateTime(2018, 09, 11) } } select ( from y in Enumerable.Range( range.start.Year, range.end.Year - range.start.Year + 1 ) let ms = y == range.start.Year ? range.start.Month : 1 let me = y == range.end.Year ? range.end.Month : 12 select from m in Enumerable.Range(ms, me - ms + 1) select new DateTime(y, m, 1) ).SelectMany(y => y) |
1 2 3 4 5 6 7 | while (startDate <= DateTime.Now) { //here you will get every new month in year Console.WriteLine(startDate.Month); //Add Month startDate=startDate.AddMonths(1); } |
山姆的答案是不正确的(好的,但如果你最终开始一天20日和你的后端是10,它不会在最后一个月)。在这里,作品的版本:
1 2 3 4 5 6 7 8 9 10 11 | public void GetMonths(DateTime startTime, DateTime endTime) { var dateCounter = new DateTime(startTime.Year, startTime.Month, 1); var endDateTarget = new DateTime(endTime.Year, endTime.Month, 1); while (dateCounter <= endDateTarget) { Console.WriteLine($"The year and month is: {dateCounter.Year}, {dateCounter.Month}"); dateCounter = dateCounter.AddMonths(1); } } |