一尘不染

如何从第二天开始指定时间

go

我想为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


题:

有没有编写此代码的较短方法?


阅读 263

收藏
2020-07-02

共1个答案

一尘不染

包装时间

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
    }
}
2020-07-02