Работа с датой в C # - PullRequest
       4

Работа с датой в C #

1 голос
/ 16 февраля 2012

У меня есть много компаний, каждая из которых имеет дату открытия и дату закрытия, например:

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)

На веб-странице пользователь должен увидеть список компаний и показатьсостояние каждого из них ( открыто или закрыто ) в зависимости от текущего времени (ВРЕМЯ ОБСЛУЖИВАНИЯ)

ПРОБЛЕМА: когда компания открывается и закрывается в один и тот же день (A) легко получить статус по следующему алгоритму: isOpen = (NOW > OpenTime AND NOW < ClosingTime), но если компания откроется в день 1 и закроется в день 2 (B, C), если пользовательпроверьте страницу в 1.00, компания B будет казаться закрытой (потому что (1.00 > 10.00 AND 1.00 < 02.00) это Ложь ), но в режиме реального времени она открыта.

Как я могу решить эту проблему (когда время закрытия дняотличается от времени открытия дня)

Ответы [ 5 ]

4 голосов
/ 16 февраля 2012

Самое простое решение, которое я могу придумать, - это проверить, меньше ли указанное время закрытия, чем время открытия, и добавить 24 часа, и проверить это значение

isOpen = (NOW > OpenTime AND NOW < (ClosingTime < OpeningTime ? ClosingTime + 24.00 : ClosingTime)
.
2 голосов
/ 16 февраля 2012

Если время открытия позже, чем время закрытия , отмените тест.

1 голос
/ 16 февраля 2012

Нечто подобное вам подойдет:

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 ;
  }

}
1 голос
/ 16 февраля 2012

Если я правильно понял, есть следующий алгоритм:

Когда время открытия меньше времени закрытия: 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 struct использовалась для представления временного интервала, но double также может использоваться (простой заменой).

0 голосов
/ 16 февраля 2012

Выражение, которое вы дали, применяется только тогда, когда OpenTime меньше времени закрытия, поэтому:

isOpen = (OpenTime < ClosingTime AND NOW >= OpenTime AND NOW < ClosingTime) OR (NOW >= OpenTime OR NOW < ClosingTime)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...