2016-04-29 10 views
1

boost :: gregorianジェネレータが提供する機能と同等のC#を探しています。boost :: gregorianジェネレータに相当するC#

具体的には、ワイルドカードの日付があり、具体的な日付に変換する必要があります。 は、例えば、ワイルドカード「月に第三月曜日は、」この機能を使用することにより

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

残念ながら、答えは「書き込む」または「それを行うライブラリを見つける」です。これらの2つのどちらもここで回答することはできません。 (1つは広すぎ、もう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 

ワイルドカードの日付はどういう意味ですか? TimeSpans?

+0

'IEnumerable 'を使用しているコードの2番目のコードでは、 'AllDatesInMonth(2016,4).Where(dt => dt.DayOfWeek == DayOfWeek.Monday); ' – Jamiec

+0

@Jamiecありがとう、私はLinqとまだ100%自信がありません:-)私は提案したように更新します – RhysO

+0

今、私は 'first/second /..../ last Monday'や 'odd months/even months'のようなワイルドカードを与えられています。今の目標は、特定の日付期間内にこれらのワイルドカードに一致するすべての特定の日付を見つけることです。これは、日付期間として'2016 'を使用した場合、' 4月の第2月曜日 'の場合は1つの日付になる可能性があります。 「2016年の奇妙な月ごとに毎週2回目」の場合、特定の日付のコレクションが表示されます。 – fleitner

関連する問題