Понимание несоответствия смещения tz в разных системах

#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 — это просто фиксированное значение из соображений производительности.