время Голанга. Format () дает разные результаты для одной и той же метки времени Unix - PullRequest
1 голос
/ 05 июня 2019

время. Время, инициализированное с помощью time.Unix () и time.Parse () с одинаковой временной меткой unix, дает разные результаты, печатаемые со временем. Формат ("2006-01-02")

Проблема не воспроизводится на игровой площадке, но я получаю ее, если сам ее компилирую.

Мой часовой пояс по умолчанию - Лос-Анджелес, возможно, в другом часовом поясе результат будет другим.

версия go go версия go1.12.1 darwin / amd64

иди строить

. / Тест

test.go:

package main

import (
    "fmt"
    "time"
)

func main() {
    control1 := time.Unix(1546300800, 0)
    test, _ := time.Parse("2006-01-02", "2019-01-01")

    fmt.Println("control:", control1.Unix(), control1.Format("2006-01-02"))
    fmt.Println("test:", test.Unix(), test.Format("2006-01-02"))
}

. / Тест контроль: 1546300800 2018-12-31 тест: 1546300800 2019-01-01

Так что Unix TS такой же (1546300800), но даты разные. Почему?

1 Ответ

3 голосов
/ 05 июня 2019

Напечатанные даты отличаются, потому что они имеют разные часовые пояса.

time.Unix() возвращает местное время , тогда как time.Parse():

Элементы, пропущенные из значения, предполагаются равными нулю или, если ноль невозможен, равны единице, поэтому при синтаксическом анализе «3:04 pm» возвращается время, соответствующее 1 января, год 0, 15:04: 00 UTC (обратите внимание, что поскольку год равен 0, это время предшествует нулевому времени).

time.Parse() возвращает time.Time с UTC зоной напо умолчанию (если информация о зоне не является частью ввода и макета).

Это также объясняет, почему вы не можете видеть ее на игровой площадке Go: местное время UTC.

Печатьинформация о зоне на моем локальном компьютере (часовой пояс CET):

fmt.Println("control:", control1.Unix(), control1.Format("2006-01-02 -0700"))
fmt.Println("test   :", test.Unix(), test.Format("2006-01-02 -0700"))

fmt.Println(control1.Zone())
fmt.Println(test.Zone())

Выходы:

control: 1546300800 2019-01-01 +0100
test   : 1546300800 2019-01-01 +0000
CET 3600
UTC 0

Если вы оба раза переключаетесь на одну и ту же зону (например, UTC или локальную),напечатанные даты будут одинаковыми:

control1 = control1.UTC()
test = test.UTC()

После этого выведите:

control: 1546300800 2019-01-01 +0000
test   : 1546300800 2019-01-01 +0000
UTC 0
UTC 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...