使用C#中的日期

本文关键字:日期 使用 | 更新日期: 2023-09-27 18:25:04

我有很多公司,每家公司都有开业日期和截止日期,例如:

Company  Open   Close

A        08.00  22.00     (close in the **same** day)
B        10.00  02.00     (close in the **second** day)
C        14.00  03.00     (close in the **second** day)

在网页上,用户必须查看公司列表,并根据当前时间(SERVER time)显示每个公司的状态(打开关闭

问题是:当公司在同一天开业和关闭时(A)很容易获得状态在以下算法中:isOpen = (NOW > OpenTime AND NOW < ClosingTime),但如果公司在第1天打开第2天关闭(B,C)如果用户在1.00检查页面,则公司B将显示为关闭(因为(1.00 > 10.00 AND 1.00 < 02.00)False),但实时打开。

如何解决此问题(当收盘时间与开盘时间不同时)

使用C#中的日期

我能想到的最简单的解决方案是检查列出的关闭时间是否小于打开时间,并添加24小时,然后对照值进行检查

isOpen = (NOW > OpenTime AND NOW < (ClosingTime < OpeningTime ? ClosingTime + 24.00 : ClosingTime)

如果打开时间晚于关闭时间,则反转测试。

如果我理解得对,有以下算法:

当打开时间小于关闭时间时:isOpen = now > openTime && now < closeTime

否则,isOpen = now > openTime || now < closeTime

TimeSpan nowTime = TimeSpan.FromHours(11);
TimeSpan openTime = TimeSpan.FromHours(8);
TimeSpan closeTime = TimeSpan.FromHours(2);
bool isOpened = openTime < closeTime
                    ? (nowTime > openTime && nowTime < closeTime)
                    : (nowTime > openTime || nowTime < closeTime);

注意:TimeSpan结构已用于时间间隔表示,但也可以使用double(通过简单替换)。

这样的东西会对你有用:

class Company
{
  public string   Name         { get ; set ; }
  // represents the time-of-day at which the company opens (e.g. 08:00, 14:00, etc.)
  public TimeSpan OpensAtTime  { get ; set ; }
  // represents the time-of-day at which the company closes (e.g.17:00, 08:00, etc. )
  public TimeSpan ClosesAtTime { get ; set ; }
  public bool IsOpen()
  {
    DateTime instant          = DateTime.Now ;
    DateTime Today            = instant.Date ;
    TimeSpan totalOpenHours   = ( this.ClosesAtTime - this.OpensAtTime ).Duration() ;
    DateTime openTimeToday    = Today + this.OpensAtTime ;
    DateTime closingTimeToday = openTimeToday + totalOpenHours ;
    bool     isOpen           = instant >= openTime && instant <= closingTime ;
    return isOpen ;
  }
}

您给出的表达式仅在OpenTime小于关闭时间时适用,因此:

isOpen = (OpenTime < ClosingTime AND NOW >= OpenTime AND NOW < ClosingTime) OR (NOW >= OpenTime OR NOW < ClosingTime)