C#等效于boost :: gregorian生成器
我正在寻找一个与boost:gregorian生成器提供的功能相当的C#。C#等效于boost :: gregorian生成器
具体来说,我有通配符日期,需要将它们转换为具体的日期。 例如一个通配符“第三个星期一在1月份可以用的boost ::阳历来完成作为
typedef nth_day_of_the_week_in_month nth_dow;
nth_dow ndm(nth_dow::third, Monday,Jan);
date d = ndm.get_date(2002);
//2002-Jan-21
通过使用此功能,它可以再进一步“每个月第三个星期一”,还是”通配符为..每个奇数月“。
什么是在C#中实现这种行为的最佳方式?
这是可能做到这一点直了DateTime.DaysInMonth foreach循环再检查的日子,但它可以是一个痛苦,所以我建议你只是建立了一个方法,如下面
public static IEnumerable<DateTime> AllDatesInMonth(int year, int month)
{
int days = DateTime.DaysInMonth(year, month);
for (int day = 1; day <= days; day++)
{
yield return new DateTime(year, month, day);
}
}
然后你可以做类似于下面的代码:
foreach (DateTime date in AllDatesInMonth(2016,4).Where(dt => dt.DayOfWeek == DayOfWeek.Monday))
break; //This will work as it will execute the break as soon as it hits the first monday of the month
你是什么意思的通配符日期虽然?时间跨度?
对于你的第二个代码 - 看到使用IEnumerable
@Jamiec谢谢,我对Linq还没有100%的信心:-)我会按照建议更新 – RhysO
现在我得到了像'first/second /..../ last last'或'odd months/even months'这样的通配符, 。目前的目标是在特定日期内找到与这些通配符匹配的所有特定日期。如果使用“2016”作为日期,则可能是“四月第二个星期一”的单一日期。如果是“2016年每个奇数月的第二周”,则会收集具体日期。 – fleitner
不幸的是,答案是“写它”或“找到一个库”。这两个人都不能/应该在这里回答。 (其中一个太宽泛,另一个是异地资源请求) – Jamiec
我的希望是在.net框架内的某个地方隐藏了这样的功能。您的评论听起来并非如此,在这种情况下,我同意在这里不能回答。谢谢。 – fleitner
写一个像'GetNthWeekDayInMonth(int yr,int mth,DayOfWeek dow)'这样的方法是相当简单的,但是为了支持你描述的那种组合,没有什么是“内置的”。 – Jamiec