Определить, не работает ли ZONEINFO в Go

В Go вы можете указать конкретный файл zoneinfo.zip, который будет использоваться, добавив переменную среды ZONEINFO, которая указывает на конкретный файл, который вы хотите использовать для получения информации о часовом поясе. Это замечательно, так как позволяет мне гарантировать, что версии базы данных часового пояса IANA, которые я использую на своем внешнем интерфейсе и на своем внутреннем сервере, совпадают.

Однако, похоже, нет никакого способа определить, не удалось ли использовать указанный файл информации о зоне. Глядя на исходный код ( https://golang.org/src/time/zoneinfo.go), похоже, что любые ошибки, связанные с использованием указанного файла, завершатся неудачно, а затем go перейдет к проверке расположения ОС по умолчанию или по умолчанию $GOROOT место, чтобы получить информацию о часовом поясе оттуда. Это не то поведение, которое я бы предпочел, поскольку я хотел бы с уверенностью знать, что я использую указанную версию информации о зоне.

Я подумал о следующем с точки зрения решений, но я не доволен ни одним из них.

  1. Я могу проверить, что переменная окружения установлена ​​самостоятельно, но в лучшем случае это частичное решение, так как оно не говорит мне, действительно ли файл используется LoadLocation.
  2. Я могу гарантировать, что ни одна из резервных копий для информации о зоне не существует. Это кажется немного экстремальным и означает, что я должен быть предельно осторожным в отношении среды, в которой выполняется код, как в dev, так и в рабочих настройках.

Кто-нибудь знает более элегантный способ убедиться, что я использую файл zoneinfo.zip, указанный в моей переменной среды ZONEINFO?

Обновление: чтобы решить эту проблему, я также вдохновился ответом @chuckx ниже и собрал пакет Go, который позволяет определить, какая база данных часовых поясов используется. В файле readme содержатся инструкции о том, как получить правильную версию базы данных часовых поясов с помощью установки Go.

1 ответ

Решение

Может быть, рассмотреть вопрос о том, чтобы не полагаться на переменную окружения?

Если вы не против распространения распакованного набора файлов, вы можете легко использовать LoadLocationFromTZData(name string, data []byte), Второй аргумент - это содержимое отдельного файла часового пояса.

Для справки: функциональность для обработки zip-файла находится в неэкспортированной функции. loadTzinfoFromZip(),

Пошаговый подход извлечен из комментария @Slotherooo:

  1. Сделать локальную версию time.loadTzinfoFromZip(zipfile, name string) ([]byte, error)
  2. Используйте этот метод для извлечения []byte для желаемого места от timeinfo.zip файл
  3. использование time.LoadLocationFromTZData() исключительно вместо time.LoadLocation
Другие вопросы по тегам