从给定日期开始经过数月和数年的简单方法

Roc*_*e C 16 c# date

我一直试图写这个循环,它只是变得越来越复杂.基本上我想采取一个给定的日期并循环每个月,直到我达到当月.因此,如果开始日期是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
            }
        }
Run Code Online (Sandbox Code Playgroud)

Sam*_*Axe 29

Date target = new Date(2011, 4, 1);
while (target < Date.Today) {
  // do something with target.Month and target.Year
  target = target.AddMonths(1);
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,根据您处理'day'组件的方式,您可能会得到不一致的结果.如果今天的日期是2013-11-10,目标日期是2013-10-01,那么你的循环就会出现2013-10和2013-11.但如果目标日期是2013-10-20,那么你的循环只能达到2013-10(它不会达到当前月份). (2认同)
  • @thecodefish - 从问题来看,我假设这一天总是以1传递,所以我认为Dan-o的代码很好.但我同意你需要检查或执行. (2认同)
  • 我想这会给我一个良好的开端.我想要消除日期部分,正是因为这个部分指出了.所以我必须设置startdate.day = 1,今天的date.day = 1,然后有while(startdate <=今天的日期),我可以确定当前的月总是被击中. (2认同)

Mat*_*int 7

DateTime endDate = DateTime.Today;
for (DateTime dt = startDate; dt <= endDate; dt = dt.AddMonths(1))
{
    Console.WriteLine("{0:M/yyyy}", dt);
}
Run Code Online (Sandbox Code Playgroud)

但如果您更喜欢while循环,那么投票给Dan-o.我做到了.:)


Slo*_*rio 5

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);
        }
    }
Run Code Online (Sandbox Code Playgroud)