#go #timezone
#Вперед #Часовой пояс
Вопрос:
Надеюсь, кто-нибудь увидит, что я делаю неправильно, или недопонимание. Я использовал 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 :: %vn", zone, offset)
Я заметил, что когда я перенес тот же код на компьютер с Linux, он сделал именно то, что я ожидал. Я нервничаю, потому что у меня нет четкого понимания, почему два вывода для очень распространенного tz будут разными.
Я достаточно знаю, что LoadLocation
ищет zip-файл из переменной ZONEINFO env. В противном случае это будет выглядеть в других системных местах, таких как $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 :: %vn", 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()
возвращается в playground ( 2009-11-10
), равно EST
(переход на летнее время закончился в воскресенье, 1 ноября 2009 года, 2:00 утра), а не EDT
. Если вы снова запустите свой тест через месяц, вы не увидите этой разницы, потому что оба раза будут EST
.
Комментарии:
1. О, потрясающе! Спасибо. Чтобы я действительно это понимал, Date учитывает переход на летнее время, что влияет на смещения, в отличие от go playground?
2. Он по-прежнему работает одинаково в playground, «текущая дата и время» в playground — это просто фиксированное значение из соображений производительности.