首页 > 解决方案 > 如何检查某个时间段内某个日期的出现

问题描述

在我的 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

标签: datetimego

解决方案


您当前正在检查的是您当前的时间是否在给定的范围内。您可能希望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


推荐阅读