Есть ли способ проверить, в каком часовом поясе я сейчас нахожусь в Linux?
Есть ли способ проверить, в каком часовом поясе я сейчас нахожусь в Linux?
Ответы:
Обычно TZ
переменная окружения скажет вам что-то полезное. Тем не менее, лучше использовать такие функции, как mktime()
и localtime()
для преобразования между time_t
местным представлением часового пояса. То есть, не пытайтесь сделать преобразование самостоятельно .
date
скажу.
echo $TZ
ничего не возвращает для меня.
Если вы имеете в виду из консоли, просто введите:
date +%Z
+07
для меня. Чтобы получить Region/City
Linux на основе Debian / Arch, посмотрите этот ответ .
Если вы хотите числовой часовой пояс:
date +'%:z %Z'
Образец вывода:
-05:00 EST
:z EST
date
. Версия BusyBox печатает что-то бессмысленное, "%: z CEST" в моем случае.
linux
ubuntu-10.04
Вместо этого я хотел найти часовой пояс в форме "США / Восток" или "Европа / Лондон". Вы можете найти это в:
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 {}" \;
найти подходящие файлы - возможно, есть лучшие способы сделать это, но это работает. Там будет несколько матчей.
find /usr/share/zoneinfo/ -type f| xargs md5sum | grep $(md5sum /etc/localtime | cut -d' ' -f1)
Для Ubuntu попробуйте это:
$ cat /etc/timezone
Образец вывода:
Asia/Kolkata
Для других дистрибутивов Ссылка: https://unix.stackexchange.com/questions/110522/timezone-setting-in-linux
timedatectl set-timezone
не обновляется/etc/timezone
. Посмотрите этот ответ для решения на основе /etc/localtime
.
Иногда вы можете искать канонический часовой пояс , а не короткую форму, производимые , 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
Для часового пояса вы можете использовать геолокацию:
$ curl https://ipapi.co/timezone
America/Chicago
Или же:
$ curl http://ip-api.com/line?fields=timezone
America/Chicago
/sbin/hwclock --systohc [--utc]
чтобы установить аппаратные часы.Ядро Linux всегда хранит и рассчитывает время как количество секунд с полуночи 1 января 1970 года по UTC, независимо от того, хранятся ли ваши аппаратные часы в формате UTC или нет. Преобразование в ваше местное время выполняется во время выполнения. Важно отметить, что если кто-то использует ваш компьютер из другого часового пояса, он может установить переменную среды TZ, и все даты и время будут отображаться правильно для своего часового пояса.
Если число секунд с 1 января 1970 года по Гринвичу хранится в виде 32-разрядного целого числа со знаком (как в вашей системе Linux / Intel), ваши часы перестанут работать где-то в 2038 году. В Linux нет проблем, связанных с Y2K , но у него есть проблема 2038 года. Надеемся, что к тому времени мы все будем работать под управлением Linux на 64-битных системах. 64-разрядные целые числа сохранят наши часы в хорошем состоянии до приблизительно 292271-миллионного года.
Использование TZ или даты НЕ НАДЕЖНО, поскольку сообщает вам часовой пояс ПОЛЬЗОВАТЕЛЯ, а не системный часовой пояс по умолчанию.
Системный часовой пояс по умолчанию хранится в / etc / timezone (который часто является символической ссылкой на файл данных часового пояса, относящийся к часовому поясу). Если у вас нет / etc / timezone, посмотрите / etc / localtime. Обычно это часовой пояс сервера. / etc / localtime часто является символической ссылкой на файл часового пояса в / usr / share / zoneinfo. Этот путь к правильному файлу часового пояса также часто дает вам информацию о географии.
В более новых Linux есть timedatectl, который дает вам тонны информации при запуске команды.
(В качестве побочного узла, если у вас есть древняя система, в которой все еще используются жестко заданные часовые пояса OLD, вы, вероятно, можете скопировать на нее файл современного часового пояса, и он будет работать. Мне приходилось делать это много раз, чтобы разрешить изменение часовых поясов на старом оборудовании).
Иногда timedatectl set-timezone
не обновляется/etc/timezone
, поэтому лучше получить связующую зону из имени файла, на который /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
Рекомендации: в этом ответе .
Вы можете показывать дату и часовой пояс одновременно:
date +'%d/%m/%Y %H:%M:%S [%:z %Z]'