|
■No91321 (Kow さん) に返信 > var start = TimeSpan.Parse("19:00");//ここは変動する > var end = TimeSpan.Parse("3:00");//次の日の3時 ここも変動する > start と end の間に 22:00〜5:00がある場合何時間なのかを知りたいのです。
深夜残業計算なのかな…。
・「end = TimeSpan.Parse("3:00")」と「end = new TimeSpan(27, 0, 0)」を区別するか ・「end = TimeSpan.FromHourse(40.0)」を許容するか否か ・「start = TimeSpan.Parse("05:00")」「end = TimeSpan.Parse("05:00")」の扱いをどうするか ・「start = TimeSpan.Parse("04:00")」「end = TimeSpan.Parse("03:00")」の扱いをどうするか
などなど、細かいルール面が曖昧なので、仕様漏れが無いよう厳密に再定義した方が良いかと思います。
■No91324 (Kow さん) に返信 > 19時から3時の22時から5時までなので5時間になればいいです。
ということは、「以上未満」算出ではなく、「以上以下」算出ですか。
static TimeSpan Example(TimeSpan start, TimeSpan end) { #region "取りうる期間の仕様が不明瞭なので、入力値が「05:00〜翌05:00」の範囲という前提にしてみた" // 5 時基準で 24 時越えを補正してみる if (start <= TimeSpan.FromHours(5.0)) { start += TimeSpan.FromDays(1.0); } if (end <= TimeSpan.FromHours(5.0)) { end += TimeSpan.FromDays(1.0); } // 24 時間を超える期間は設問上未定義なので想定しない if ((end - start).TotalHours > 24.0) { throw new ArgumentOutOfRangeException(); } #endregion
if (end <= start || end <= TimeSpan.FromHours(22.0)) { return TimeSpan.Zero; } Func<TimeSpan, TimeSpan, TimeSpan> Max = (a, b) => (a < b) ? b : a; Func<TimeSpan, TimeSpan, TimeSpan> Min = (a, b) => (a < b) ? a : b; return Min(TimeSpan.FromHours(29.0), end) - Max(TimeSpan.FromHours(22.0), start); }
|