C#の機能に関する質問/回答を読み、作業日数を計算します(月曜日から金曜日までの日数)。拡張コードを使用するものもあります。C#特定の日付を除いた就業日の計算方法(祝日)
50,000行以上のデータテーブルがあり、この情報を計算するのに効果的な方法が必要でした。
C#の機能に関する質問/回答を読み、作業日数を計算します(月曜日から金曜日までの日数)。拡張コードを使用するものもあります。C#特定の日付を除いた就業日の計算方法(祝日)
50,000行以上のデータテーブルがあり、この情報を計算するのに効果的な方法が必要でした。
/// <summary> Get working days between two dates (Excluding a list of dates - Holidays) </summary>
/// <param name="dtmCurrent">Current date time</param>
/// <param name="dtmFinishDate">Finish date time</param>
/// <param name="lstExcludedDates">List of dates to exclude (Holidays)</param>
public static int fwGetWorkingDays(this DateTime dtmCurrent, DateTime dtmFinishDate, List<DateTime> lstExcludedDates)
{
Func<DateTime, bool> workDay = currentDate =>
(
currentDate.DayOfWeek == DayOfWeek.Saturday ||
currentDate.DayOfWeek == DayOfWeek.Sunday ||
lstExcludedDates.Exists(evalDate => evalDate.Date.Equals(currentDate.Date))
);
return Enumerable.Range(0, 1 + (dtmFinishDate - dtmCurrent).Days).Count(intDay => workDay(dtmCurrent.AddDays(intDay)));
}
私は基本的に2つの日付と(休日)を除外する日付のリストを受け取り、この拡張機能を作成しました。 驚くべきことに、このメソッドは非常に高速で、除外リストと比較してDateTimeから時刻を除外するための検証があります。 @MiBolsに基づいて
「作業日」の定義は何かによって異なります。祝日は就業日とはみなされません。私はあなたがしたことをやります。私は、ソフトウェアが提供する特定の種類の組織について、今後数年間、毎年祝日のリストを保管しています。その公休日チェックをコードに追加すると、TRUEの労働日の計算機が得られます。 dbテーブルに将来10〜12行を入力するのに10分を費やすのは大きな負担ではありません。 –
は、より効率的なソリューションではなく、検索がO(1)
に続いているList<DateTime>
のHashSet<DateTime>
を使用するようになります答え:
/// <summary> Get working days between two dates (Excluding a list of dates - Holidays) </summary>
/// <param name="dtmCurrent">Current date time</param>
/// <param name="dtmFinishDate">Finish date time</param>
/// <param name="excludedDates">Collection of dates to exclude (Holidays)</param>
public static int fwGetWorkingDays(this DateTime dtmCurrent, DateTime dtmFinishDate,
HashSet<DateTime> excludedDates)
{
Func<DateTime, bool> workDay = currentDate => (
currentDate.DayOfWeek == DayOfWeek.Saturday ||
currentDate.DayOfWeek == DayOfWeek.Sunday ||
excludedDates.Contains(currentDate.Date));
return Enumerable.Range(0, 1 + (dtmFinishDate - dtmCurrent).Days)
.Count(intDay => workDay(dtmCurrent.AddDays(intDay)));
}
明確にするために - あなたはAの間、すべての休日を見つけるために探していますある年(その日から失われた時間を計算することができます)、または1年間の作業時間を探していますか? – confusedandamused