Как проверить вхождение даты в период - PullRequest
0 голосов
/ 28 марта 2019

В моем приложении Go я пытаюсь проверить вхождение даты за период.

if survey.StartPeriod.Before(time.Now()) && survey.EndPeriod.After(time.Now()) {
    fmt.Println("1 BLOCK")
}
else if survey.EndPeriod.Before(time.Now()) {
    fmt.Println("2 BLOCK")
}

Если у меня есть такие входящие данные (текущее время внутри периода):

Current TIME | 2019-03-28 21:02:47.0377305 +0600 +06 m=+60.748044601
START_PERIOD | 2019-03-28 21:00:00 +0000 +0000
END_PERIOD   | 2019-03-28 21:05:00 +0000 +0000

Я хочу запустить код внутри 1 блока.Мой текущий код запускает этот блок, только если я использую функцию Before для обоих периодов.Я не уверен, что это правильно.

Если у меня есть такие входящие данные (текущее время за пределами end_period):

Current TIME | 2019-03-28 21:10:47.0377305 +0600 +06 m=+60.748044601
START_PERIOD | 2019-03-28 21:00:00 +0000 +0000
END_PERIOD   | 2019-03-28 21:05:00 +0000 +0000

Я хочу запустить код внутри 2 блока.Правильно знаю, это работает неправильно.Как правильно сделать эту логику программы?

РЕДАКТИРОВАТЬ :

Как вы можете видеть CURRENT_TIME внутри диапазона.

CURRENT_TIME | 2019-03-29 08:32:06.1375323 +0600 +06 m=+60.318452301
START_PERIOD | 2019-03-29 08:30:00 +0000 +0000
END_PERIOD   | 2019-03-29 08:31:00 +0000 +0000

Когда я пытаюсьдля проверки функции InTimeSpan возвращается false неверное значение.Я действительно смущен.Почему это происходит?!

log.Println(InTimeSpan(survey.StartPeriod, survey.EndPeriod, time.Now()))
// return false

1 Ответ

1 голос
/ 28 марта 2019

В настоящее время вы проверяете, находится ли ваше текущее время в заданном диапазоне.Возможно, вы захотите поменять time.Now на другое время, чтобы проверить вхождение даты.

Однако следует учитывать несколько моментов:

  • делает эту логику внешней функцией, так какон должен отвечать только true или false, что-то вроде этого так просто, как:
func InTimeSpan(start, finish time.Time, timeToCheck time.Time) bool {
    return start.Before(timeToCheck) && finish.After(timeToCheck)
} 
  • сделать все время в одном часовом поясе.Может быть полезно, если часовой пояс времени, который вы проверяете, отличается, и это позволяет избежать некоторых крайних случаев, например:
func InTimeSpan(start, finish time.Time, timeToCheck time.Time) bool {
    return start.UTC().Before(timeToCheck) && finish.UTC().After(timeToCheck)
}

Демо-версия действительно слабая: https://play.golang.org/p/rzv3coztN4Z

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