123

Есть ли способ проверить, в каком часовом поясе я сейчас нахожусь в Linux?

13 ответов13

238

Если вы имеете в виду из консоли, просто введите:

date +%Z
52

Если вы хотите числовой часовой пояс:

date +'%:z %Z'

Образец вывода:

-05:00 EST
24

Вместо этого я хотел найти часовой пояс в форме "США / Восточная" или "Европа / Лондон". Вы можете найти это в:

  • /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 {}" \;

    найти подходящие файлы - возможно, есть лучшие способы сделать это, но это работает. Там будет несколько матчей.

19

Обычно переменная окружения TZ скажет вам кое-что полезное. Однако лучше всего использовать такие функции, как mktime() и localtime() для преобразования между time_t и локальным представлением часового пояса. То есть не пытайтесь сделать преобразование самостоятельно.

8

Для Ubuntu попробуйте это:

$ cat /etc/timezone

Образец вывода:

Asia/Kolkata

Для других дистрибутивов Ссылка: https://unix.stackexchange.com/questions/110522/timezone-setting-in-linux

6

Иногда вы можете искать канонический часовой пояс, а не краткую форму, созданную 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
4
$ strings /etc/localtime | tail -n 1
MST7MDT,M3.2.0,M11.1.0

Так что я на Горе. Хотя приведенные выше советы по использованию переменных среды или просто выводу команды date иногда работают лучше, в зависимости от того, как вы хотите их использовать.

2
  • /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-миллионного года.

2

Для часового пояса вы можете использовать геолокацию:

$ curl https://ipapi.co/timezone
America/Chicago

Или же:

$ curl http://ip-api.com/line?fields=timezone
America/Chicago

http://wiki.archlinux.org/index.php/time#Time_zone

1

Пара решений:

date +"%Z %z"
timedatectl | grep "Time zone"
cat /etc/timezone

дал мне (соответственно):

UTC +0000
Time zone: Etc/UTC (UTC, +0000)
Etc/UTC

Мой компьютер на UTC.

0

Вы можете показывать дату и часовой пояс одновременно:

date +'%d/%m/%Y  %H:%M:%S [%:z  %Z]'
0

Использование TZ или даты НЕ НАДЕЖНО, потому что оно сообщает вам часовой пояс ПОЛЬЗОВАТЕЛЯ, а не системный часовой пояс по умолчанию.

Системный часовой пояс по умолчанию хранится в /etc /timezone (который часто является символической ссылкой на файл данных часового пояса, относящийся к часовому поясу). Если у вас нет /etc /timezone, посмотрите /etc /localtime. Обычно это часовой пояс сервера. /etc /localtime часто является символической ссылкой на файл часового пояса в /usr /share /zoneinfo. Этот путь к правильному файлу часового пояса также часто дает вам информацию о географии.

В более новых Linux есть timedatectl, который дает вам массу информации при запуске команды.

(В качестве побочного узла, если у вас есть древняя система, в которой все еще используются жестко запрограммированные часовые пояса OLD, вы, вероятно, можете скопировать в нее файл современного часового пояса, и он будет работать. Мне приходилось делать это много раз, чтобы разрешить изменение часовых поясов на старом оборудовании).

0

Иногда 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

Ссылки: в этом ответе.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .