4

2 つの値の間の時間を計算し、特定の日付を除外しようとしていLocalDateTimeます (この例では、祝日です)。

var bankHolidays = new[] { new LocalDate(2013, 12, 25), new LocalDate(2013, 12, 26) };
var localDateTime1 = new LocalDateTime(2013, 11, 18, 10, 30);
var localDateTime2 = new LocalDateTime(2013, 12, 29, 10, 15);

var differenceBetween = Period.Between(localDateTime1, localDateTime2, PeriodUnits.Days | PeriodUnits.HourMinuteSecond);

ご想像differenceBetweenのとおり、値は 2 つの日付間の日数/時間/分/秒を示しています。

開始日から毎日チェックして、bankHolidaysコレクションにその日付が含まれているかどうかを確認できます。

var bankHolidays = new[] { new LocalDate(2013, 12, 25), new LocalDate(2013, 12, 26) };
var localDateTime1 = new LocalDateTime(2013, 11, 18, 10, 30);
var localDateTime2 = new LocalDateTime(2013, 12, 29, 10, 15);

var differenceBetween = Period.Between(localDateTime1, localDateTime2, PeriodUnits.Days | PeriodUnits.HourMinuteSecond);

var london = DateTimeZoneProviders.Tzdb["Europe/London"];

for (var i = 1; i < differenceBetween.Days; ++i)
{
    var x = localDateTime1.InZoneStrictly(london) + Duration.FromStandardDays(i);

    if (bankHolidays.Any(date => date == x.Date))
    {
        //subtract one day for the period.
    }
}

いくつかの明白なことが欠けているように感じます。より簡単な方法があるはずです。特定の日付を除外しながら、2 つの日付の間の期間を見つける簡単な方法はありますか?

週末もこの除外に含める必要があります。明らかな方法は、週末の曜日を確認しながら銀行の休日を確認することですが、これはそれを処理する最善/正しい方法ではないようです。

4

2 に答える 2

0

差を取得するために使用するだけTimeSpanです。すべての時間は現在のローカル タイム ゾーンです。

var bankHolidays = new[] { new DateTime(2013, 12, 25), new DateTime(2013, 12, 26) };
var localDateTime1 = new DateTime(2013, 11, 18, 10, 30, 0);
var localDateTime2 = new DateTime(2013, 12, 29, 10, 15, 0);
var span = localDateTime2 - localDateTime1;
var holidays = bankHolidays[1] - bankHolidays[0];
var duration = span-holidays;

から までの経過duration時間です。を介して 2 つの日付を除外する場合は、上記の操作を簡単に変更できます。localDateTime1localDateTime2bankHolidays

この操作には追加のメソッドを使用できます。

public static TimeSpan GetPeriod(DateTime start, DateTime end, params DateTime[] exclude)
{
    var span = end - start;
    if (exclude == null) return span;
    span = exclude.Where(d => d >= start && d <= end)
    .Aggregate(span, (current, date) => current.Subtract(new TimeSpan(1, 0, 0, 0)));
    return span;
}

これで、次のように使用できます。

var duration = GetPeriod(localDateTime1, localDateTime2, bankHolidays);
于 2013-11-18T11:09:36.537 に答える