2016-04-29 85 views
1

我正在尋找一個與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

回答

0

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