2016-08-09 3 views
0

я столкнулся с проблемой с Go кодом, связанной с часовыми поясами, которые будут возвращать либо 1900-01-01 01:00:00 +0100 CET или 1900-01-01 00:53:28 +0053 LMT, в зависимости от того, какой машины это бежится:Откуда вы получаете информацию о часовом поясе?

https://play.golang.org/p/K3ceq1n1KI

Я был в состоянии исключить Go версию как источник разницы. Откуда Go получает информацию о часовом поясе?

+2

Информация о временной зоне предоставляется операционной системой. Вы спрашиваете, откуда эта база данных? – JimB

+0

Просьба предоставить дополнительную информацию об этой проблеме, с которой вы столкнулись. Ваш вопрос не совсем ясен, без этой информации. – apxp

ответ

1

На самом деле это зависит.

Проверить время. Источник LoadLocation() и комментарий над ним. В частности, он говорит, что это:

// LoadLocation looks in the directory or uncompressed zip file 
// named by the ZONEINFO environment variable, if any, then looks in 
// known installation locations on Unix systems, 
// and finally looks in $GOROOT/lib/time/zoneinfo.zip. 

И вы должны иметь в виду, что на системах Unix/Posix (например, Linux), соответствующие файлы данных часовых поясов всегда доступны в «известных местах установки». Но в других системах таких мест нет. В результате в Windows зона LoadLocation не будет находить никаких часовых поясов (если не были правильно настроены ZONEINFO или GOROOT), и вместо этого будет использоваться только по умолчанию (это UTC, если моя память верна).

Однако проблема LMT, описанная выше, является немного другим зверем. Видите ли, LMT - не совсем правильный часовой пояс. Например. см. here. И я не выяснил, откуда именно это происходит, но я подозреваю, что это связано с тем, что часовой пояс еще не был установлен в то время, когда вы конвертируете. Итак, пойдите, кажется, вычисляет LMT места вместо этого.

Например, если вы просто изменили год с 1900 по 2000 год (или даже 1905 год) на своем игровом поле, он выйдет с правильным часовым поясом (CET).

Что касается разницы между машинами, я бы сказал, что вполне закономерно, что является самым естественным способом определения правил часовых поясов, прежде чем они были введены. В результате я бы предположил, что в некоторых базах данных часовых поясов время начала первого правила в часовом поясе будет либо опущено, либо скорректировано, чтобы распространить его дальше на прошлое. В то время как другие вместо этого устанавливают LMT offset. (Несмотря на то, что большинство, если не все из них, так или иначе получены из одной и той же базы данных IANA).

Если вы хотите обеспечить точное то же поведение на разных машинах, я бы сказал, создавая свой собственный zoneinfo.zip и настройка ZONEINFO должна помочь.

Смежные вопросы