我想在反映可用的最新营业时间的记录上设置“截至”值。
例如,假设我们将工作时间定义为 MF,上午 9 点到下午 5 点。如果我在星期四下午 4:00 调用它,“截至”应该是星期四下午 4:00;但是,如果我在星期一早上 1:30 调用它,那么“截至”应该是上一个星期五的下午 5:00。
我可以用一堆逻辑来解决这个问题,但这似乎是某个类的“功能”,其中工作几乎已经完成,或者有一种简单的方法可以做到这一点。
有没有?还是我被困在写一些可恶的算法?
C# 不包括任何开箱即用的东西,但你可以尝试这样的事情:
public DateTime? GetLatestOpen(DateTime current)
{
var openHours = ...collection of pairs of int (Day) and two date times (TimeRange[])...
if (!openHours.Any()) { return null; } //prevent inf. loop if no open hours ever
var currentDay = current.DayOfWeek;
var hoursToday = openHours.FirstOrDefault(oh => oh.DayOfWeek == currentDay);
if (hoursToday != null)
{
var currentTime = current.TimeOfDay();
if (currentTime >= hoursToday.TimeRange[0] &&
currentTime <= hoursToday.TimeRange[1])
{
return currentTime;
}
else
{
return hoursToday.TimeRange[1];
}
}
return GetLatestOpen(current.AddDays(-1));
}
...
var latestOpen = GetLatestOpen(DateTime.Now);
...
您的openHours
集合将如下所示(为简单起见,我使用了匿名类型):
var openHours = new [] { new { Day = 1, TimeRange = new DateTime[] { ...Open..., ...Close...} }, new { Day = 2...... } };
笔记:
关于上述几点需要注意:
Day = 0
是星期天,Day = 1
是星期一....Day = 6
是星期六TimeRange
如果需要,您可以使用其他类型的集合...Open...
and...Close...
DateTime
对象,你不必担心实际的 Date;你只携带时间部分如果您对此有任何疑问,请告诉我。我希望这有帮助!祝你好运,编码愉快!:)
您可以使用.NET的时间周期库的CalendarPeriodCollector:
// ----------------------------------------------------------------------
public DateTime GetLatestBusinessHour( DateTime moment )
{
// filter the business hours: - Monday to Friday, 9AM to 5PM
CalendarPeriodCollectorFilter filter = new CalendarPeriodCollectorFilter();
filter.AddWorkingWeekDays();
filter.CollectingHours.Add( new HourRange( 9, 17 ) );
// collect business hours of the past week
CalendarPeriodCollector collector = new CalendarPeriodCollector( filter,
new TimeRange( moment.AddDays( -7 ), moment ), SeekDirection.Forward,
new TimeCalendar( new TimeCalendarConfig { EndOffset = TimeSpan.Zero } ) );
collector.CollectHours();
// end of the last period
return collector.Periods.End;
} // GetLatestBusinessHour