我想为第二天(明天)的确切时间创建一个time.Time
。现在,我想设置小时和分钟。
这是我目前使用的代码:
now := time.Now()
tomorrow := time.Date(now.Year(), now.Month(), now.Day(), 15, 0, 0, 0, time.UTC).AddDate(0,0,1)
这将为今天创建一个Date
,其中包含我正在寻找的确切时间(小时和分钟),然后在该Date
上添加一天。这很好。
示例:
想象time.Now()
是2009-11-10 23:00:00 +0000 UTC
。
以下代码的结果为:2009-11-10 15:00:00 +0000 UTC
tomorrow := time.Date(now.Year(), now.Month(), now.Day(), 15, 0, 0, 0, time.UTC)
到目前为止,我使用AddDate(0, 0, 1)
添加了一天。结果就是第二天的期望时间:2009-11-11 15:00:00 +0000 UTC
。
请参阅:https://play.golang.org/p/OKR9V1HN50x
问题:
有没有更短的编写代码的方法?
答案 0 :(得分:2)
import "time"
月份,日期,小时,分钟,秒和nsec值可能不在其范围内 通常的范围,并将在转换过程中标准化。对于 例如,10月32日转换为11月1日。
这更有效。它将对程序包time
的函数和方法的调用减至最少。
package main
import (
"fmt"
"time"
)
func main() {
now := time.Now()
fmt.Println(now.Round(0))
yyyy, mm, dd := now.Date()
tomorrow := time.Date(yyyy, mm, dd+1, 15, 0, 0, 0, now.Location())
fmt.Println(tomorrow)
}
输出:
2019-06-21 16:23:06.525478162 -0400 EDT
2019-06-22 15:00:00 -0400 EDT
一些基准:
BenchmarkNow-8 31197811 36.6 ns/op
BenchmarkTomorrowPeterSO-8 29852671 38.4 ns/op
BenchmarkTomorrowJens-8 9523422 124 ns/op
bench_test.go
:
package main
import (
"testing"
"time"
)
func BenchmarkNow(b *testing.B) {
for N := 0; N < b.N; N++ {
now := time.Now()
_ = now
}
}
var now = time.Now()
func BenchmarkTomorrowPeterSO(b *testing.B) {
for N := 0; N < b.N; N++ {
// now := time.Now()
yyyy, mm, dd := now.Date()
tomorrow := time.Date(yyyy, mm, dd+1, 15, 0, 0, 0, now.Location())
_ = tomorrow
}
}
func BenchmarkTomorrowJens(b *testing.B) {
for N := 0; N < b.N; N++ {
// now := time.Now()
tomorrow := time.Date(now.Year(), now.Month(), now.Day(), 15, 0, 0, 0, now.Location()).AddDate(0, 0, 1)
_ = tomorrow
}
}