以MM / YYYY格式获取日期之间的所有月份

时间:2013-10-04 12:27:21

标签: c# datetime

我希望在两个给定日期之间以格式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()));
  } 
}

提前感谢您的帮助。

6 个答案:

答案 0 :(得分: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)

(就个人而言,我更喜欢在输出中包含起始月份,但这不是你要求的。)

答案 1 :(得分: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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

你可以使用这个代码,它更优雅:

for (DateTime date = StartDate; date <= EndDate; date = date.AddMonths(1))
    Console.WriteLine(date.ToString("MM/yyyy"));

答案 4 :(得分: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))

答案 5 :(得分: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 />");
        }