Получение названия канонического часового пояса в оболочке script

Есть ли способ получить имя Canonical Time Zone из оболочки Linux script? например, если мой настроенный часовой пояс - это PDT, тогда я хотел бы получить "America/Los_Angeles".

Я знаю, что мог бы получить из символической ссылки /etc/localtime, если она была настроена, но поскольку она не может быть настроена на всех серверах, я не могу полагаться на нее.
С другой стороны, я могу получить короткое имя часового пояса с датой команды +% Z, но мне все еще нужно каноническое имя.

Есть ли способ получить каноническое имя текущего часового пояса или преобразовать часовой пояс, полученный с помощью команды даты +% Z, даже если символическая ссылка /etc/localtime не установлена?

Ответ 1

Это сложнее, чем кажется. Большинство дистрибутивов Linux делают это по-другому, поэтому нет 100% надежного способа получить имя Olson TZ.

Ниже приведена эвристика, которую я использовал в прошлом:

  • Сначала проверьте /etc/timezone, если он существует.
  • Далее проверьте, является ли /etc/localtime символической ссылкой на базу данных часовых поясов.
  • В противном случае найдите файл в /usr/share/zoneinfo с тем же содержимым как файл /etc/localtime

Неподтвержденный пример кода:

if [ -f /etc/timezone ]; then
  OLSONTZ=`cat /etc/timezone`
elif [ -h /etc/localtime ]; then
  OLSONTZ=`readlink /etc/localtime | sed "s/\/usr\/share\/zoneinfo\///"`
else
  checksum=`md5sum /etc/localtime | cut -d' ' -f1`
  OLSONTZ=`find /usr/share/zoneinfo/ -type f -exec md5sum {} \; | grep "^$checksum" | sed "s/.*\/usr\/share\/zoneinfo\///" | head -n 1`
fi

echo $OLSONTZ

Обратите внимание, что этот быстрый пример не обрабатывает случай, когда несколько имен TZ соответствуют данному файлу (при просмотре /usr/share/zoneinfo ). Несогласование соответствующего имени TZ будет зависеть от вашего приложения.

-nick