我需要的是获得如何在两个日期之间获得月份名称的逻辑。
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
答案 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)
我不明白为什么你需要Dictionary
或List<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月。