Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将DateTime设置为最新营业时间的优雅方式_C#_Date_Date Math - Fatal编程技术网

C# 将DateTime设置为最新营业时间的优雅方式

C# 将DateTime设置为最新营业时间的优雅方式,c#,date,date-math,C#,Date,Date Math,我想在记录上设置一个“截止日期”值,以反映可用的最新营业时间 例如,我们将营业时间定义为上午9点到下午5点。如果我在周四下午4:00调用此命令,“截止日期”应为周四下午4:00;但是,如果我在周一上午1:30调用此函数,“截止日期”应为上周五下午5:00 我可以用一些逻辑来解释这一点,但这似乎是某个类的一个“特性”,在这个类中,工作已经基本完成,或者有一种简单的方法来完成 有吗?还是我一直在写一些令人讨厌的算法?C#不包括任何现成的算法,但您可以尝试以下方法: public DateTime?

我想在记录上设置一个“截止日期”值,以反映可用的最新营业时间

例如,我们将营业时间定义为上午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);

...

注意事项:

关于上述内容,需要注意以下几点:

  • Day=0
    是星期天,
    Day=1
    是星期一<代码>日=6是星期六
  • 如果需要,您可以为
    时间范围使用另一种类型的集合
  • 对于
    …Open…
    …Close…
    DateTime
    对象,您无需担心实际日期;你只携带大约一部分时间


  • 如果你对此有任何疑问,请告诉我。我希望这有帮助!祝你好运,编码愉快!:)

    您可以使用以下的CalendarPeriodCollector


    我猜你被困住了,需要写下你自己的逻辑…:)你在说什么?你需要一个用c#写的方法来实现这个吗?如果是这样的话,你尝试过什么?我希望我不需要一个用C#编写的方法;我希望有一个类或机制已经为它预先存在。不,没有现成的东西。在.net框架中没有这样的类,因为它非常具体。你必须用datetimes和timespans创建你自己的类。我最后做了类似的事情。
    var openHours = new [] { new { Day = 1, TimeRange = new DateTime[] { ...Open..., ...Close...} }, new { Day = 2...... } };
    
    // ----------------------------------------------------------------------
    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