Определить, не работает ли ZONEINFO в Go - PullRequest
0 голосов
/ 27 июня 2018

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

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

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

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

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

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

1 Ответ

0 голосов
/ 27 июня 2018

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

Если вы не против распространения распакованного набора файлов, вы можете легко использовать 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
...