我一直在尝试编写这个循环,它只是变得越来越复杂。基本上我想采取一个给定的日期并循环每个月,直到我达到当月。因此,如果开始日期是11/1/2011,那么我想循环遍历
11 / 2011,12 / 2011,1 / 2012,2 / 2012等。
这是我开始的,但这不起作用。一旦我遇到新的一年,我需要内循环重新开始,而不是startdate.Month。一般来说,循环数月和数年有更好的方法吗? 感谢
for (var y = startdate.Year; y <= DateTime.Now.Year; y++)
{
for (var m = startdate.Month; m <= 12; m++)
{
//do something with m and y
}
}
答案 0 :(得分:26)
Date target = new Date(2011, 4, 1);
while (target < Date.Today) {
// do something with target.Month and target.Year
target = target.AddMonths(1);
}
答案 1 :(得分:7)
DateTime endDate = DateTime.Today;
for (DateTime dt = startDate; dt <= endDate; dt = dt.AddMonths(1))
{
Console.WriteLine("{0:M/yyyy}", dt);
}
但是如果你喜欢while循环,那么投票给Dan-o。我做到了。 :)
答案 2 :(得分:1)
这将在几个月内循环,而月份的日期不会成为问题。
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);
}
答案 3 :(得分:0)
while (startDate <= DateTime.Now)
{
//here you will get every new month in year
Console.WriteLine(startDate.Month);
//Add Month
startDate=startDate.AddMonths(1);
}
答案 4 :(得分:0)
在给定日期之间生成一个月的第一天的范围(作为IEnumerable`DateTime):
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)
答案 5 :(得分:-1)
Sam的回答很好,但最终还是不正确的(如果开始日期是20,结束日期是10,则不包括最后一个月)。这是一个有效的版本:
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);
}
}