首页 > 解决方案 > 检查 time.now 是否在一天中的两次之间

问题描述

我有一个时间对象,它将使用以下内容动态生成:

timeNow := time.Now()

我需要检查现在的时间是否在给定的开始和结束时间之内。

所以我会有两个这样的字符串:

startTime := "8:00 AM"
endTime := "10:00 PM"

然后我会以某种方式将这些字符串转换为时间对象,并检查时间内置的 .before() 和 .after() 函数。

问题是,我不确定如何使用今天的日期(从 time.now 开始)创建时间对象,但从给定时间开始,即像“8:00 AM”这样的字符串,这怎么可能?谢谢

标签: go

解决方案


AS @Volker 建议(在评论中)如果您可以将小时作为整数进行比较,timeNow.Hour()那么这是一个好方法。如果你必须处理一个字符串(例如来自配置文件),那么你可以做这样的事情(操场

startTime := "8:00 AM"
endTime := "10:00 PM"
now := time.Now()

// Parse the start/end times
sTimeOnly, err := time.Parse("3:04 PM", startTime)
if err != nil {
    panic(err)
}
eTimeOnly, err := time.Parse("3:04 PM", endTime)
if err != nil {
    panic(err)
}

// Add current date to the times
s := time.Date(now.Year(), now.Month(), now.Day(), sTimeOnly.Hour(), sTimeOnly.Minute(), sTimeOnly.Second(), sTimeOnly.Nanosecond(), now.Location())
e := time.Date(now.Year(), now.Month(), now.Day(), eTimeOnly.Hour(), eTimeOnly.Minute(), eTimeOnly.Second(), eTimeOnly.Nanosecond(), now.Location())

if now.Before(s) || now.After(e) {
    fmt.Println("Outside of time range")
} else {
    fmt.Println("Within time range")
}

注意: time.Now() 返回当前本地时间(即您的机器配置为使用的任何时区的时间)。这很重要,因为如果运行应用程序的机器未配置为在正确的时区运行,那么结果将不会如您预期的那样。


推荐阅读