Надеюсь, что кто-то увидит, что я делаю неправильно, или недопонимание. Я использовал 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 ...
Спасибо.
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
.
Похожие вопросы
Новые вопросы
go
Go — это язык программирования с открытым исходным кодом, с синтаксисом, частично унаследованным от C. Он имеет статическую типизацию с ограниченными возможностями динамической типизации; он также включает автоматическое управление памятью, встроенные примитивы параллелизма, массивы переменной длины, называемые слайсами, и большую стандартную библиотеку.