c#跨越午夜的比赛班次

时间:2017-09-05 21:53:06

标签: c# date datetime timespan enum-flags

我有以下netfiddle:

.net fiddle

如何通过添加跨越午夜的时间段来使其工作:

`new Period( "9", Days.Workdays, TimeSpan.FromHours(22), TimeSpan.FromHours(07) )`

从22:00(晚上10:00)到07:00(07:00 AM)通知

2 个答案:

答案 0 :(得分:2)

Matt上面有正确的答案,但有一些变化:

首先,你需要确保你有括号(因此你的记忆问题):

var period = _periods.Where(e => e.Days.HasFlag(day) && (e.Start <= e.End ? (e.Start <= timeOfDay && e.End > timeOfDay) : (e.Start <= timeOfDay || e.End > timeOfDay))).FirstOrDefault();

其次,在你的GetShiftPeriods方法中,你需要换一天(简单地添加句号。在这种情况下赢得了工作,因为那只是&#34; 7小时&#34;而不是7早晨。

        var next = current.Date + period.End;
        if (period.End < period.Start)
        {
            next = next.AddDays(1);
        }

最后,您在定义的期间有一些重叠。当我删除上面两个更改的句点#4(注释掉)时,它对我来说很好。不确定你是否打算重叠,但如果你这样做 - 那段时间将被忽略。

答案 1 :(得分:1)

假设您的问题与代码的这一部分有关:

e.Start <= timeOfDay && e.End > timeOfDay

您可以将其更改为以下内容以计算午夜时间范围:

e.Start <= e.End                                   // Are times in sequence?
    ? (e.Start <= timeOfDay && e.End > timeOfDay)  // Yes - standard calculation (AND)
    : (e.Start <= timeOfDay || e.End > timeOfDay)  // No - inverse calculation (OR)