-1
曜日と時間を指定すると、平日のみ(土曜日または日曜日の時間なし)を使用して時間を差し引くと、新しい日付が計算されます。日付から曜日を差し引いた新しい日付を計算する良い方法はありますか?
私は平日の時間を引いた日付を計算する次の2つの関数を持っています。より良い方法がありますか?
static DateTime SubtractWeekdayHours
(
DateTime date2subtractFrom
, int hours2subtract
)
{
if (hours2subtract < 1 || hours2subtract > 120)
throw new Exception("SubtractWeekdayHours() only subtracts hours between 1 and 120 inclusive.");
var weekdayDateTime = DateTime.Now;
// Check if the end of the span touches the weekend:
if (date2subtractFrom.DayOfWeek == DayOfWeek.Saturday || date2subtractFrom.DayOfWeek == DayOfWeek.Sunday)
{
Debug.Write(", End of span EXCEPTION: " + date2subtractFrom.ToString("F"));
var SaturdayStartOf = date2subtractFrom.DayOfWeek == DayOfWeek.Saturday ? date2subtractFrom.Date : date2subtractFrom.AddDays(-1).Date;
weekdayDateTime = SaturdayStartOf.AddHours(-hours2subtract);
}
else
{ // Check if the start of the span touches the weekend:
var possibleWeekendDate = date2subtractFrom.AddHours(-hours2subtract);
if (possibleWeekendDate.DayOfWeek == DayOfWeek.Saturday || possibleWeekendDate.DayOfWeek == DayOfWeek.Sunday)
{
Debug.Write(", Start of span EXCEPTION: " + possibleWeekendDate.ToString("F"));
weekdayDateTime = calculateWeekdayDateTimeWhenSpanTouchesWeekend(possibleWeekendDate, date2subtractFrom, hours2subtract);
}
else
{
var simpleSubtraction = false;
var daysToCheck = hours2subtract/24;
if (daysToCheck > 0)
{ // Check if any part of the span touches the weekend:
var weekendTouched = false;
for (var x = -daysToCheck; x < 0; x++)
{
possibleWeekendDate = date2subtractFrom.AddDays(x);
if (possibleWeekendDate.DayOfWeek == DayOfWeek.Saturday || possibleWeekendDate.DayOfWeek == DayOfWeek.Sunday)
{
weekendTouched = true;
Debug.Write(", Span EXCEPTION:" + possibleWeekendDate.ToString("F"));
weekdayDateTime = calculateWeekdayDateTimeWhenSpanTouchesWeekend(possibleWeekendDate, date2subtractFrom, hours2subtract);
break;
}
}
if (!weekendTouched)
{ // Span start and end do not touch a weekend and do not span a weekend, so it is just simple subtraction:
simpleSubtraction = true;
}
}
else
{ // Span start and end do not touch a weekend and the number of hours are less than 24, so it is just simple subtraction:
simpleSubtraction = true;
}
if (simpleSubtraction)
{
Debug.Write(", Simple subtraction:");
weekdayDateTime = date2subtractFrom.AddHours(-hours2subtract);
}
}
}
return weekdayDateTime;
}
private static DateTime calculateWeekdayDateTimeWhenSpanTouchesWeekend
(
DateTime weekendDate
, DateTime date2subtractFrom
, int hours2subtract
)
{
var MondayStartOf = weekendDate.DayOfWeek == DayOfWeek.Saturday ? weekendDate.AddDays(2).Date : weekendDate.AddDays(1).Date;
var timeSpan = date2subtractFrom - MondayStartOf;
var hoursLeft = hours2subtract - timeSpan.TotalHours;
var SaturdayStartOf = MondayStartOf.AddDays(-2);
return SaturdayStartOf.AddHours(-hoursLeft);
}
私は次のtodoを期待しているからです。休日を含める - しかしこれはhttp://codereview.stackexchange.comの質問です –
私は正直に自分自身の例外を作成しますこれを対応して。そうすれば、try-catchブロックで日付計算をラップすることができます。それをWeekendSpanExceptionなどと呼んでください。おそらくすぐにメンテナンスの悪夢を防ぐのに役立ちます。 – Ingenioushax