Как получить определенное время со следующего дня? - PullRequest
1 голос
/ 21 июня 2019

Я хочу создать 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() is 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


Вопрос:

Isесть более короткий способ написать этот код?

1 Ответ

2 голосов
/ 21 июня 2019

Пакетное время

import "time" 

Значения месяца, дня, часа, минимума, секунды и nsec могут быть вне их обычные диапазоны и будут нормализованы при конвертации. За Например, 32 октября конвертируется в 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
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...