4

我想MM/YYYY在两个给定日期之间获取所有带有年份的月份。

像这样的东西:

Start date: 08/1/2012
End date: 03/1/2013

结果:

09/2012
10/2012
11/2012
12/2012
01/2013
02/2013
03/2013

这是我拥有的代码,但它不能按我的意愿工作。

for (int i = StartDate.Year; i <= EndDate.Year; i++)
{
  for (int j = StartDate.Month+1; j <= 12 ; j++)
  {
    Console.WriteLine(j.ToString("00") + "/" + i.ToString()));
  } 
}

预先感谢您的帮助。

4

6 回答 6

4
for 
(
    DateTime date = new DateTime(2012, 08, 01).AddMonths(1);
    date <= new DateTime(2013, 03, 01);
    date = date.AddMonths(1)
)
{
    Console.WriteLine(date.ToString("MM/yyyy"));
}

如果您为日期编写一个单独的枚举器,这将更具可读性和健壮性,如下所示:

public static IEnumerable<DateTime> MonthsBetween(int startMonth, int startYear, int endMonth, int endYear)
{
    for
    (
        DateTime date = new DateTime(startYear, startMonth, 01).AddMonths(1);
        date <= new DateTime(endYear, endMonth, 01);
        date = date.AddMonths(1)
    )
    {
        yield return date;
    }
}

你可以这样称呼:

foreach (var date in MonthsBetween(08, 2012, 03, 2013))
{
    Console.WriteLine(date.ToString("MM/yyyy"));
}

请注意,此范围不包括第一个月,从您的示例看来,这是您想要的。

如果您不想跳过第一个月,请.AddMonths(1)从创建开始日期的行中删除 。

(就个人而言,我更愿意在输出中包含开始月份,但这不是您要求的。)

于 2013-10-04T12:32:34.183 回答
1

您可以使用以下方法for循环增加月份值DateTime.AddMonths

DateTime dt1 = new DateTime(2012, 08, 01);
DateTime dt2 = new DateTime(2013, 03, 01);
DateTime dt3 = new DateTime();
for (dt3 = dt1.AddMonths(1); dt3 <= dt2; dt3 = dt3.AddMonths(1))
{
    Console.WriteLine(dt3.ToString("MM/yyyy"));
}

输出将是;

09.2012
10.2012
11.2012
12.2012
01.2013
02.2013
03.2013

这里一个DEMO.

于 2013-10-04T12:34:51.607 回答
1

您的 startdate 的 day 值可能大于 enddate 的 day 值。在这种情况下,有必要将结束日期标准化为月末

List<string> result = new List<string>();
DateTime startDate = new DateTime(2012, 1, 8);
DateTime endDate = new DateTime(2013, 1, 3);
DateTime temp = startDate;
endDate = new DateTime (endDate.Year, endDate.Month, DateTime.DaysInMonth(endDate.Year,endDate.Month));
while (temp <= endDate)
{
    Console.WriteLine((string.Format("{0}/{1}", temp.Month, temp.Year));
    temp = temp.AddMonth(1);
}
于 2013-10-04T12:45:05.507 回答
0

您可以使用此代码,它更优雅:

for (DateTime date = StartDate; date <= EndDate; date = date.AddMonths(1))
    Console.WriteLine(date.ToString("MM/yyyy"));
于 2013-10-04T12:34:09.403 回答
0

未经测试,但这样的事情怎么样:

public IEnumerable<String> EachMonth(DateTime start, DateTime end)
{
    for(var m = start.Date; m.Date <= end.Date; m = m.AddMonths(1))
        yield return m.ToString("MM/YYYY");
}

然后你可以像这样使用它:

foreach (String month in EachMonth(StartDate, EndDate))
于 2013-10-04T12:46:00.750 回答
0
DateTime StartDate = Convert.ToDateTime("08/1/2012");
        DateTime EndDate = Convert.ToDateTime("03/1/2013");

        for (DateTime i = StartDate; i <= EndDate; i = i.AddMonths(1))
        {
            Response.Write(i.ToString("MM") + "/" + i.ToString("yyyy")+"<br />");
        }
于 2013-10-04T12:46:48.253 回答