获取两个日期之间的所有月份和年份

时间:2014-02-23 16:54:46

标签: c#

我需要的是获得如何在两个日期之间获得月份名称的逻辑。

Dictionary<Monthname,year> GetMonthsandYear(Datetime d1,Datetime d2) 
       or
List<Tuple<string,int> GetMonthsandYear(Datetime d1,Datetime d2)

示例:jan-1-2013至mar-3-2013

应返回2013年1月至2013年2月至2013年3月,或以反向格式返回list.reverse

2 个答案:

答案 0 :(得分:6)

如果您的实际要求是“前24个月”,则更简单。刚开始当前月份,并获得第一天 - 然后迭代并添加1个月24次。

就我个人而言,我会返回IEnumerable<DateTime>而不是其他任何东西 - 你可以根据需要格式化每个元素 - 但这很简单:

public static IEnumerable<DateTime> GetMonths(int count)
{
    // Note: this uses the system local time zone. Are you sure that's what
    // you want?
    var today = DateTime.Today;
    // Always return the 1st of the month, so we don't need to worry about
    // what "March 30th - 1 month" means
    var startOfMonth = new DateTime(today.Year, today.Month, 1);
    for (int i = 0; i < count; i++)
    {
        yield return startOfMonth;
        startOfMonth = startOfMonth.AddMonths(-1);
    }
}

然后,如果你想要List<string>这些值为“2014年2月”等,你可以:

var monthYears = GetMonths(24).Select(dt => dt.ToString("MMMM yyyy"))
                              .ToList();

请注意,除非您真的不关心订单,否则Dictionary<...> 是合适的 - 我怀疑您这样做。当您将其视为序列时,您不应该依赖于从Dictionary<TKey, TValue>返回项目的顺序 - 它不是有序的集合。

答案 1 :(得分:5)

我不明白为什么你需要DictionaryList<Tuple<string,int>,但可能有一个解决方案;

DateTime dt1 = new DateTime(2013, 1, 1);
DateTime dt2 = new DateTime(2013, 3, 3);

while (dt1 < dt2)
{
    Console.WriteLine(dt1.ToString("MMMM-yyyy"));
    dt1 = dt1.AddMonths(1);
}

结果将是;

January-2013
February-2013
March-2013

即使您需要,也可以将这些值添加到List<string>循环中的while

但要小心Jon said ,如果dt1.Day大于dt2.Day,此解决方案将仅生成1月和2月。