我想为time.Time第二天(明天)的确切时间点创建一个。现在,我想设置小时和分钟。
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。这很好。
Date
例:
想象time.Now()是2009-11-10 23:00:00 +0000 UTC。
time.Now()
2009-11-10 23:00:00 +0000 UTC
以下代码的结果将是: 2009-11-10 15: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。
AddDate(0, 0, 1)
2009-11-11 15:00:00 +0000 UTC
请参阅:https://play.golang.org/p/OKR9V1HN50x
题:
有没有编写此代码的较短方法?
包装时间 import "time" 月,日,小时,分钟,秒和nsec值可能超出其通常范围,并将在转换过程中进行归一化。例如,10月32日转换为11月1日。
包装时间
import "time"
月,日,小时,分钟,秒和nsec值可能超出其通常范围,并将在转换过程中进行归一化。例如,10月32日转换为11月1日。
这样更有效。它最大程度地减少了对包time函数和方法的调用。
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:
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 } }