Есть ли способ проверить, в каком часовом поясе я сейчас нахожусь в Linux?
13 ответов
Если вы имеете в виду из консоли, просто введите:
date +%Z
Если вы хотите числовой часовой пояс:
date +'%:z %Z'
Образец вывода:
-05:00 EST
Вместо этого я хотел найти часовой пояс в форме "США / Восточная" или "Европа / Лондон". Вы можете найти это в:
- /etc/timezone (присутствует в Ubuntu и Red Hat? но не например Amazon Linux)
- (в системах стиля Red Hat) как
ZONE="US/Eastern"
в /etc/sysconfig /clock или вы можете попытаться сопоставить /etc/localtime с одним из файлов в /usr /share /zoneinfo; досадно, что это не символическая ссылка, но вы можете, например,
cd /usr /share /zoneinfo
find * -type f -exec sh -c "diff -q /etc/localtime '{}'> /dev /null && echo {}" \;найти подходящие файлы - возможно, есть лучшие способы сделать это, но это работает. Там будет несколько матчей.
Обычно переменная окружения TZ
скажет вам кое-что полезное. Однако лучше всего использовать такие функции, как mktime()
и localtime()
для преобразования между time_t
и локальным представлением часового пояса. То есть не пытайтесь сделать преобразование самостоятельно.
Для Ubuntu попробуйте это:
$ cat /etc/timezone
Образец вывода:
Asia/Kolkata
Для других дистрибутивов Ссылка: https://unix.stackexchange.com/questions/110522/timezone-setting-in-linux
Иногда вы можете искать канонический часовой пояс, а не краткую форму, созданную date %Z
например, US/Eastern
. В системах с timedatectl
например Fedora, timedatectl
выводит много полезной информации, включая текущую зону:
# timedatectl
Local time: Tue 2016-09-13 17:10:26 EDT
Universal time: Tue 2016-09-13 21:10:26 UTC
RTC time: Tue 2016-09-13 21:10:26
Time zone: US/Eastern (EDT, -0400)
Network time on: yes
NTP synchronized: yes
RTC in local TZ: no
К сожалению, timedatectl
принимает в качестве команды set-timezone
, но не имеет соответствующего get-timezone
. Разобрать его следующим образом:
# timedatectl status | grep "zone" | sed -e 's/^[ ]*Time zone: \(.*\) (.*)$/\1/g'`
US/Eastern
$ strings /etc/localtime | tail -n 1
MST7MDT,M3.2.0,M11.1.0
Так что я на Горе. Хотя приведенные выше советы по использованию переменных среды или просто выводу команды date иногда работают лучше, в зависимости от того, как вы хотите их использовать.
- /etc/sysconfig/clock устанавливает, хранятся ли аппаратные часы в формате UTC или по местному времени.
- Символическая ссылка /etc/localtime на /usr /share /zoneinfo /... для установки вашего часового пояса.
- Введите
/sbin/hwclock --systohc [--utc]
чтобы установить аппаратные часы.
Ядро Linux всегда хранит и рассчитывает время как количество секунд с полуночи 1 января 1970 года по UTC, независимо от того, хранятся ли ваши аппаратные часы в формате UTC или нет. Преобразование в ваше местное время выполняется во время выполнения. Важно отметить, что если кто-то использует ваш компьютер из другого часового пояса, он может установить переменную среды TZ, и все даты и время будут отображаться правильно для своего часового пояса.
Если количество секунд с 1 января 1970 года по Гринвичу хранится в виде 32-разрядного целого числа со знаком (как в вашей системе Linux/Intel), ваши часы перестанут работать где-то в 2038 году. У Linux нет проблем, связанных с Y2K, но есть проблема 2038 года. Надеемся, что к тому времени мы все будем работать под управлением Linux на 64-битных системах. 64-разрядные целые числа будут поддерживать наши часы достаточно хорошими до приблизительно 292271-миллионного года.
Для часового пояса вы можете использовать геолокацию:
$ curl https://ipapi.co/timezone
America/Chicago
Или же:
$ curl http://ip-api.com/line?fields=timezone
America/Chicago
Пара решений:
date +"%Z %z"
timedatectl | grep "Time zone"
cat /etc/timezone
дал мне (соответственно):
UTC +0000
Time zone: Etc/UTC (UTC, +0000)
Etc/UTC
Мой компьютер на UTC.
Вы можете показывать дату и часовой пояс одновременно:
date +'%d/%m/%Y %H:%M:%S [%:z %Z]'
Использование TZ или даты НЕ НАДЕЖНО, потому что оно сообщает вам часовой пояс ПОЛЬЗОВАТЕЛЯ, а не системный часовой пояс по умолчанию.
Системный часовой пояс по умолчанию хранится в /etc /timezone (который часто является символической ссылкой на файл данных часового пояса, относящийся к часовому поясу). Если у вас нет /etc /timezone, посмотрите /etc /localtime. Обычно это часовой пояс сервера. /etc /localtime часто является символической ссылкой на файл часового пояса в /usr /share /zoneinfo. Этот путь к правильному файлу часового пояса также часто дает вам информацию о географии.
В более новых Linux есть timedatectl, который дает вам массу информации при запуске команды.
(В качестве побочного узла, если у вас есть древняя система, в которой все еще используются жестко запрограммированные часовые пояса OLD, вы, вероятно, можете скопировать в нее файл современного часового пояса, и он будет работать. Мне приходилось делать это много раз, чтобы разрешить изменение часовых поясов на старом оборудовании).
Иногда timedatectl set-timezone
не обновляет /etc/timezone
, поэтому лучше получить tiemzone из имени файла, на который указывает символическая ссылка /etc/timezone
:
#!/bin/bash
set -euo pipefail
if filename=$(readlink /etc/localtime); then
# /etc/localtime is a symlink as expected
timezone=${filename#*zoneinfo/}
if [[ $timezone = "$filename" || ! $timezone =~ ^[^/]+/[^/]+$ ]]; then
# not pointing to expected location or not Region/City
>&2 echo "$filename points to an unexpected location"
exit 1
fi
echo "$timezone"
else # compare files by contents
# https://stackoverflow.com/questions/12521114/getting-the-canonical-time-zone-name-in-shell-script#comment88637393_12523283
find /usr/share/zoneinfo -type f ! -regex ".*/Etc/.*" -exec \
cmp -s {} /etc/localtime \; -print | sed -e 's@.*/zoneinfo/@@' | head -n1
fi
Ссылки: в этом ответе.