Надеюсь, что кто-то увидит, что я делаю неправильно, или недопонимание. Я использовал time pkg в песочнице Go, чтобы познакомиться с тем, как правильно использовать функции, специфичные для часового пояса. Хотя я уже знал некоторые смещения, я использовал следующий сайт, чтобы дважды проверить себя: https://documentation.mersive.com/content/topics/api-timezones.htm. В этом случае, когда я запрашиваю смещение для "America / New_York", я ожидаю -14400. Однако, когда я запустил следующее в песочнице Go, я получил вместо этого -18000: https://play.golang.org/p/aU0JFHzueU1

americatz, err := time.LoadLocation("America/New_York")
if err != nil {
  fmt.Println(err)
  return
}

t := time.Now().In(americatz)
zone, offset := t.Zone()
fmt.Printf("%v :: %v\n", zone, offset)

Я заметил, что когда я перенес тот же код на Linux-машину, он сделал именно то, что я ожидал. Я нервничаю, потому что у меня нет четкого понимания, почему два вывода для очень обычного tz будут разными. Я достаточно знаю, что LoadLocation ищет zip-файл из переменной окружения ZONEINFO. В противном случае он будет искать в других системных местах, таких как $GOROOT/lib/time/zoneinfo.zip.

Неужели просто и понятно, что сервер Go, на котором выполняется код, и сервер Linux имеют разные файлы информации о зоне? И если мне нужно одинаковое поведение во всех системах ... означает ли это, что мне нужно всегда загружать и устанавливать свою собственную переменную ZONEINFO? Я чувствую, что большинство людей ожидают -14400 ...

Спасибо.

0
JackR 15 Окт 2020 в 22:22

1 ответ

Лучший ответ

На детской площадке установлено время на «2009-11-10 23:00:00 UTC», потому что «это упрощает кэширование программ, предоставляя им детерминированный вывод». (из поля "О программе").

Это может повлиять на смещение часового пояса из-за перехода на летнее время. Следующее даст ответ, которого вы ожидаете:

today := time.Date(2020,10,16,0,0,0,0,americatz)
zone, offset = today.Zone()
fmt.Printf("%v :: %v\n", zone, offset)

Детская площадка

Дальнейшие детали:

Из-за перехода на летнее время смещение меняется в зависимости от времени; Например:

time.Date(2020,10,16,0,0,0,0,americatz).Zone() вернет смещение -14400, тогда как time.Date(2020,1,16,0,0,0,0,americatz).Zone() вернет -18000.

Так уж получилось, что now() возвращается на игровую площадку (2009-11-10) EST (летнее время закончилось в воскресенье, 1 ноября 2009 г., 2:00 утра), а не {{X3 }}. Если вы снова запустите свой тест через месяц, вы не увидите этой разницы, потому что оба раза будут в EST.

5
Brits 15 Окт 2020 в 19:47