Определить, не работает ли ZONEINFO в Go
В Go вы можете указать конкретный файл zoneinfo.zip, который будет использоваться, добавив переменную среды ZONEINFO, которая указывает на конкретный файл, который вы хотите использовать для получения информации о часовом поясе. Это замечательно, так как позволяет мне гарантировать, что версии базы данных часового пояса IANA, которые я использую на своем внешнем интерфейсе и на своем внутреннем сервере, совпадают.
Однако, похоже, нет никакого способа определить, не удалось ли использовать указанный файл информации о зоне. Глядя на исходный код ( https://golang.org/src/time/zoneinfo.go), похоже, что любые ошибки, связанные с использованием указанного файла, завершатся неудачно, а затем go перейдет к проверке расположения ОС по умолчанию или по умолчанию $GOROOT место, чтобы получить информацию о часовом поясе оттуда. Это не то поведение, которое я бы предпочел, поскольку я хотел бы с уверенностью знать, что я использую указанную версию информации о зоне.
Я подумал о следующем с точки зрения решений, но я не доволен ни одним из них.
- Я могу проверить, что переменная окружения установлена самостоятельно, но в лучшем случае это частичное решение, так как оно не говорит мне, действительно ли файл используется LoadLocation.
- Я могу гарантировать, что ни одна из резервных копий для информации о зоне не существует. Это кажется немного экстремальным и означает, что я должен быть предельно осторожным в отношении среды, в которой выполняется код, как в dev, так и в рабочих настройках.
Кто-нибудь знает более элегантный способ убедиться, что я использую файл zoneinfo.zip, указанный в моей переменной среды ZONEINFO?
Обновление: чтобы решить эту проблему, я также вдохновился ответом @chuckx ниже и собрал пакет Go, который позволяет определить, какая база данных часовых поясов используется. В файле readme содержатся инструкции о том, как получить правильную версию базы данных часовых поясов с помощью установки Go.
1 ответ
Может быть, рассмотреть вопрос о том, чтобы не полагаться на переменную окружения?
Если вы не против распространения распакованного набора файлов, вы можете легко использовать LoadLocationFromTZData(name string, data []byte)
, Второй аргумент - это содержимое отдельного файла часового пояса.
Для справки: функциональность для обработки zip-файла находится в неэкспортированной функции. loadTzinfoFromZip()
,
Пошаговый подход извлечен из комментария @Slotherooo:
- Сделать локальную версию
time.loadTzinfoFromZip(zipfile, name string) ([]byte, error)
- Используйте этот метод для извлечения
[]byte
для желаемого места отtimeinfo.zip
файл - использование
time.LoadLocationFromTZData()
исключительно вместоtime.LoadLocation