イースター、クリスマス、土曜日などの「休業日」を考慮せずに、日を日時に合計できるライブラリ/メソッドが存在するかどうかを知りたいです。
DateTime.Addメソッドが存在することは知っていますが、これは「非稼働日」を考慮していません。
どうもありがとうございます!
いいえ、独自の非稼働日を定義し、独自の機能を構築する必要があります。
曜日を教えてくれる DateTime メソッドがあるので、土日をチェックできますが、あとはあなた次第です。Office で使用する場合は、使用できる dll がいくつかあります。それ以外の場合は、おそらく、それを計算できるオープンソース プロジェクト (多くのプロジェクトが存在します) を見つけたいと思うでしょう。
DateTime.Now.DayOfWeek
これは非常に地域固有のものになるため、複数の国でコードを使用する予定がある場合は、これを考慮する必要があります。また、アメリカでも州ごとに祝日が異なります。
開始日とそれにかかる作業日数を指定して、何かの終了日を見つけたいと思いますか?
もしそうなら、これはあなたが望むものかもしれません。サポートしている最大範囲のすべての休日のリストがあることを前提としています。要件によっては、数年先になる可能性があります。
このコードは、開始日と稼働日数 (および休日のリスト) を受け取り、終了日を返します。
public static DateTime AddWorkingDays(DateTime start, int workingDays, IEnumerable<DateTime> holidays)
{
var dict = new HashSet<DateTime>(holidays);
DateTime date;
for (date = start; workingDays > 0; date = date.AddDays(1))
{
if (!dict.Contains(date))
{
--workingDays;
}
}
return date;
}
別の実装では、ある日が休日かどうかを判断するために呼び出すことができる述語があることを前提としています。
public static DateTime AddWorkingDays(DateTime start, int workingDays, Predicate<DateTime> isHoliday)
{
DateTime date;
for (date = start; workingDays > 0; date = date.AddDays(1))
{
if (!isHoliday(date))
{
--workingDays;
}
}
return date;
}
これらの実装は両方とも、すべての日付を訪問することに苦しんでいます。これは問題にならない可能性がありますが、日付範囲が大きい場合は遅すぎる可能性があります。