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#中实现这种行为的最佳方式?

+1

不幸的是,答案是“写它”或“找到一个库”。这两个人都不能/应该在这里回答。 (其中一个太宽泛,另一个是异地资源请求) – Jamiec

+0

我的希望是在.net框架内的某个地方隐藏了这样的功能。您的评论听起来并非如此,在这种情况下,我同意在这里不能回答。谢谢。 – fleitner

+0

写一个像'GetNthWeekDayInMonth(int yr,int mth,DayOfWeek dow)'这样的方法是相当简单的,但是为了支持你描述的那种组合,没有什么是“内置的”。 – Jamiec

这是可能做到这一点直了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 

你是什么意思的通配符日期虽然?时间跨度?

+0

对于你的第二个代码 - 看到使用IEnumerable ' - 它可能只是'AllDatesInMonth(2016,4).Where(dt => dt.DayOfWeek == DayOfWeek.Monday);' – Jamiec

+0

@Jamiec谢谢,我对Linq还没有100%的信心:-)我会按照建议更新 – RhysO

+0

现在我得到了像'first/second /..../ last last'或'odd months/even months'这样的通配符, 。目前的目标是在特定日期内找到与这些通配符匹配的所有特定日期。如果使用“2016”作为日期,则可能是“四月第二个星期一”的单一日期。如果是“2016年每个奇数月的第二周”,则会收集具体日期。 – fleitner