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

本文关键字:之间 取日期 MM YYYY 格式 获取 | 更新日期: 2023-09-27 18:33:50

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

提前感谢您的帮助。

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

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)

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

开始日期的日值可能大于结束日期的日值。在这种情况下,有必要将结束日期规范化到月底

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);
}
您可以使用

DateTime.AddMonths方法for月份值递增的循环;

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.

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

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

没有测试,但像这样的事情怎么样:

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