Проверка даты между указанными c датами, рассчитанными с сегодняшнего дня в определенном часовом поясе - PullRequest
0 голосов
/ 27 мая 2020

Сценарий

У меня есть устаревшая система, в которой даты хранятся в базе данных в datetime полях в AEST времени (восточное стандартное время Австралии).

Мне нужно получить date сформировать базу данных и проверить, находится ли он между 16:00 вчера и 15:00 сегодня в AEST времени.

Я не уверен в часовом поясе сервера, поэтому я конвертирую UtcNow в часовой пояс AEST в получить Today за AEST время, а затем выполнить вычисления интервала, чтобы получить указанные c даты для сравнения.

Правильна ли приведенная ниже реализация, мои текущие проблемы:

  1. Выполнение расчетов интервалов для получения c заданных дат. Есть ли способ лучше?
  2. Учитывается ли здесь летнее время

Реализация

DateTime dateFromDbInAEST = // date retrieved from the database (stored in AEST)

TimeZoneInfo aestTimeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("AUS Eastern Standard Time");
DateTime todayAEST = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, aestTimeZoneInfo).Date;

DateTime fourPMYesterdayAEST = todayAEST.AddHours(-8).Dump();
DateTime threeThirtyPMTodayAEST = todayAEST.AddHours(15.5).Dump();

bool isBetween = (fourPMYesterdayAEST <= dateFromDbInAEST) && (dateFromDbInAEST <= threeThirtyPMTodayAEST);

1 Ответ

0 голосов
/ 27 мая 2020

Сначала я бы сделал метод расширения, так как это позволит использовать более описательные обозначения. Также немного упрощает задачу - оберните вокруг этого несколько модульных тестов, и вы можете быть уверены, что он ведет себя так, как вы думаете, что он должен вести себя:

public static class DateTimeExtensions {

  private static readonly AEST = TimeZoneInfo.FindSystemTimeZoneById("AUS Eastern Standard Time");

  public static bool isWithinWindow( this DateTime instant ) {
    DateTime dtNow  = TimeZoneInfo.ConvertTimeFromUtc( DateTime.UtcNow, AEST ).Date ;

    // 16:00 on the previous day
    DateTime dtFrom = dtNow
                      .AddDays(    -1 )
                      .AddHours(   16 )
                      .AddMinutes(  0 );

    // 15:30 on the current day
    DateTime dtThru = dtNow
                      .AddDays(     0 )
                      .AddHours(   15 )
                      .AddMinutes( 30 );

    bool withinWindow = instant >= dtFrom && instant <= dtThru ;
    return withinWindow ;
  }

}

Как только вы это получите, вы можете сказать:

public void process() {
  // date retrieved from the database (stored in AEST)
  DateTime dbDateTimeInAEST = getSomeDateTimeValueFromDatabase() ;

  bool isWithinWindow = dbDateTimeInAEST.isWithinWindow()  ;
  if ( isWithinWindow ) {
      // do the processing for things that are within the window
  }
  else {
      // do the processing for things that are outside the window
  }
}

И, да, TimeZoneInfo должен волшебным образом позаботиться о переключениях между летним и стандартным временем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...