Datetime 如何检查期间中日期的出现情况

Datetime 如何检查期间中日期的出现情况,datetime,go,Datetime,Go,在我的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") } 如果我有此类传入数据(期间内的当前时间): 我想在

在我的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")
}
如果我有此类传入数据(期间内的当前时间):

我想在1个块内运行代码。仅当我对两个时段都使用
Before
函数时,我的当前代码才会运行该块。我不确定这是否正确

如果我有此类传入数据(当前时间在期末时间之外):

我想在2块内运行代码。是的,我知道它不正确。如何正确地使这个程序逻辑

编辑

正如您可以看到的
CURRENT\u 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

您当前要检查的是当前时间是否在给定范围内。您可能需要交换
时间。现在用另一个时间来检查日期的出现情况

但是,需要考虑以下几点:

  • 将此逻辑设置为外部函数,因为它只需要使用true或false进行响应,类似这样的操作非常简单:
  • 将所有时间设置为同一时区。如果您正在检查的时区不同,这可能会有所帮助,并且可以避免某些边缘情况,例如:

非常蹩脚的演示:

您应该将
time.Now()赋值给一个变量,这样您两次都在检查相同的时间。实际上,您的比较是不同的(相差几微秒)。在您的情况下,这可能不是什么大问题,但可能会导致错误的结果,特别是在非常短的时间跨度内。由于解析了
StartTime
EndTime
,因此它们没有单时钟值,因此,跨越DST变更的检查也很有可能导致一些有趣的行为。在您的示例中,当前时间在2019年,而开始和结束时间都在2018年,因此都在该时间段之外,可能这导致了意外行为。好吧,我终于找到了问题的原因。所有时间(
开始时段
结束时段
当前时段
)我都转换为UTC。在我的例子中,
time.Now().UTC()
显示了滞后6小时的时间。因此,我将其更改为
time.Now().UTC().Add(6*time.Hour)
。正如你所看到的,这是一种优雅的方式。有没有办法用UTC设置时区?您好!你能再看一次我的帖子吗?我不知道为什么,但它不起作用。您知道问题的原因吗?我注意到您仅在
start
finish
中使用
UTC()
。我也按照你的建议做
time.Now()
return
2019-03-29 10:22:39.1766669+0600+06 m=+60.516185201
start.UTC()
return
2019-03-29 10:20+0000 UTC
finish.UTC()
return
2019-03-29 10:30+0000 UTC
。也许这就是函数不能正常工作的原因。同时如果我使用
time.Now().UTC()
它会重新返回
2019-03-29 04:22:39.1766669+0000 UTC
。那么,我终于找到了问题的原因。所有时间(也是当前时间)转换为UTC。在我的例子中,
time.Now().UTC()
显示了滞后6小时的时间。因此,我将其更改为
time.Now().UTC().Add(6*time.Hour)
。正如你所看到的,这是一种优雅的方式。有没有办法设置UTC时区。@NurzhanoGerbek您既可以解析区域设置中的时间,也可以解析将时间更改为区域设置时间:如果您有日期时间,并且希望在某个位置解析它,则可以使用
time.ParseInLocation
,或者,当您有一个time.time结构并且想要更改其他位置时,您可以签出
time.In(l位置)
:我相信您在示例中错误地解析了开始日期和结束日期。您应该在当前所在的位置解析它们,或者所有内容都应该在UTC中
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
log.Println(InTimeSpan(survey.StartPeriod, survey.EndPeriod, time.Now()))
// return 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)
}