如何获得两个日期之间的月份集合?

时间:2015-09-23 06:23:01

标签: c# .net datetime

以下是我的代码。我只是得到两个日期之间的差异,但我想要那个月的名字来自于和来日期。

public static int GetMonthsBetween(DateTime from, DateTime to)
{
    if (from > to) return GetMonthsBetween(to, from);

    var monthDiff = Math.Abs((to.Year * 12 + (to.Month - 1)) - (from.Year * 12 + (from.Month - 1)));

    if (from.AddMonths(monthDiff) > to || to.Day < from.Day)
    {
        return monthDiff - 1;
    }
    else
    {
        return monthDiff;
    }
}

3 个答案:

答案 0 :(得分:7)

根据您的代码,您可以将月份差异从&#34;减去&#34; DateTime从输入中获取DateTime差异。

public static List<DateTime> GetMonthsBetween(DateTime from, DateTime to)
{
    if (from > to) return GetMonthsBetween(to, from);

    var monthDiff = Math.Abs((to.Year * 12 + (to.Month - 1)) - (from.Year * 12 + (from.Month - 1)));

    if (from.AddMonths(monthDiff) > to || to.Day < from.Day)
    {
        monthDiff -= 1;
    }

    List<DateTime> results = new List<DateTime>();
    for (int i = monthDiff; i >= 1; i--)
    {
        results.Add(to.AddMonths(-i));
    }

    return results;
}

要获取月份名称,只需将DateTime格式化为&#34; MMM&#34;。

var dts = GetMonthsBetween(DateTime.Today, DateTime.Today.AddMonths(5));
foreach (var dateTime in dts)
{
    Console.WriteLine(dateTime.ToString("MMM"));
}

答案 1 :(得分:3)

如果您想要两个日期之间所有月份的名称,请使用以下内容:

var d1 = new DateTime(2015,6,1);
var d2 = new DateTime(2015,9,1);

var monthlist = new List<string>();
string format = d1.Year == d2.Year ? "MMMM" : "MMMM yyyy";

for (var d = d1; d <= d2; d = d.AddMonths(1))
{
    monthlist.Add(d.ToString(format));
}

完整列表现在位于monthlist - 您需要从方法中返回

答案 2 :(得分:1)

假设您正在使用Java和JodaTime,您的代码中存在一些缺陷。

  1. 您无法使用from > to来评估某个日期是否在另一个之后。请改用from.isAfter(to)
  2. JodaTime已经提供了一种方法来计算两个给定日期Months.monthsBetween(start,end)之间的整月数量。
  3. 使用计算的月份差异,您可以实例化一个新的DateTime对象,该对象包含所需月份中的日期,并通过yourNewDateTimeObject.month().getAsText()输出其名称。
  4. 编辑:刚发现你正在使用C#,所以请忽略我上面的文字。在这里,我将尝试用C#回答你的问题。

    1. 为什么不从from日期中减去to并获得差异?

    2. 生成的TimeSpan可用于确定两个给定日期之间的整月数量。

    3. 要获取生成的月份名称,您可以使用yourDateTime.ToString("MMMM");