我List<T>
在一天 24 小时内有一个可用时间,还有两个TimeSpans
minTime 和 maxTime。
我需要在 和 之间找到一天中的时间,List<T>
但是由于它在多个时区中使用,minTime 和 maxTime 可以在不同的日子里,并且跨越像下午 1 点到第二天凌晨 1 点minTime
maxTime
我最接近的是这个,但我觉得我在这里遗漏了一些主要组件,或者因为我对这个TimeSpan
对象相当陌生,所以做的事情效率很低。我就是想不通是什么...
// Make new TimeSpan out of maxTime to eliminate any extra days (TotalHours >= 24),
// then check if time on the MaxTime is earlier than the MinTime
if (new TimeSpan(maxTime.Hours, maxTime.Minutes, maxTime.Seconds) < minTime)
{
// If time on MaxTime is earlier than MinTime, the two times span separate days,
// so find first time after minTime OR before maxTime
nextAvailableTime = Times.FirstOrDefault(p =>
(p.Time.TimeOfDay >= minTime || (p.Time.TimeOfDay < maxTime))
&& p.Count < ConcurrentAppointments);
}
else
{
// If time on MaxTime is later than MinTime, the two times are for the same day
// so find first time after minTime AND before maxTime
nextAvailableTime = Times.FirstOrDefault(p =>
(p.Time.TimeOfDay >= minTime && p.Time.TimeOfDay < maxTime)
&& p.Count < ConcurrentAppointments);
}
使用列表Times
EST(我的当地时间),但是minTime
和maxTime
可以基于其他时区。
例如,如果我们针对夏威夷时区运行此算法,我们最终会得到minTime = new TimeSpan(13, 0, 0)
和maxTime = new TimeSpan(25, 0, 0)
,因为 8am - 8pm HST = 1pm - 1am EST。
Times
集合是一个List<AppointmentTime>
,并且是一个类,AppointmentTime
如下所示:
class AppointmentTime
{
DateTime Time { get; set; }
int Count { get; set; }
}
我很确定我在这里遗漏了一些重要的东西,或者应该有一种我不知道的更有效的方法来做到这一点,但我真的想不出它会是什么。我的算法有问题吗?或者找到可能跨越不同日子的TimeOfDay
两个更有效的方法?TimeSpans
更新
我根据CasperOne 的回答找出了我缺少的东西。我忘记了日期实际上很重要,因为我的时间跨越不同的时区。
使用我上面的夏威夷时区示例,在星期一安排约会会导致在星期日晚上错误地安排夏威夷约会。
我的解决方案是在为 24 小时的“第一个窗口”安排约会之前检查前一天是否有效,并通过.AddDays(maxTime.Days)
比较来调整约会日期maxTime
// If time on MaxTime is earlier than MinTime, the two times span separate days,
// so find first time after minTime OR before maxTime if previous day has appointments set as well
var isPreviousDayValid = IsValidDate(AppointmentDate.AddDays(-1));
nextAvailableTime = Times.FirstOrDefault(p =>
(p.Time.TimeOfDay >= minTime
|| (p.Time.AddDays(maxTime.Days).TimeOfDay < maxTime && isPreviousDayValid)
) && p.Count < ConcurrentAppointments);