Как проверить, какой часовой пояс в Linux?

129

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

Питер Мортенсен
источник

Ответы:

19

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

Грег Хьюгилл
источник
2
есть ли команда, которая сообщает о часовом поясе, в котором находится пользователь?
26
Конечно, dateскажу.
Грег Хьюгилл
у меня есть два экземпляра сервера, если я даю команду «дата» на обоих серверах, это показывает разное время. часовой пояс и для сервера IST, время одного сервера: пн 11 июля 10:39:31 IST 2011 и другой сервер пн 11 июля 10:35:31 IST 2011 .. есть разница в 4 минуты
8
На Precise Pangolin echo $TZничего не возвращает для меня.
Иэн Сэмюэл Маклин, старейшина
3
@GregHewgill ваш ответ бесполезен на первый взгляд. Рассмотрите возможность редактирования своего ответа, пожалуйста. Смотрите наиболее проголосовавший ответ ниже. Я буду понижать ваш ответ на данный момент. Также на моих машинах по умолчанию нет TZ env.
therealmarv
244

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

date +%Z
Rasman
источник
2
хорошо, хорошо работает
Серебряная Луна
15
это должен быть принятый ответ
KalenGi
Хороший вопрос ... изменил ответ на этот вопрос
Расман
И чтобы установить часовой пояс из командной строки в Ubuntu, следующая ссылка содержит тривиальную однострочную команду для этого: askubuntu.com/a/524362/182454
Дэн Ниссенбаум,
Это дает +07для меня. Чтобы получить Region/CityLinux на основе Debian / Arch, посмотрите этот ответ .
Том Хейл
54

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

date +'%:z %Z'

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

-05:00 EST
Пол Варгас
источник
7
На OS X это выводит:z EST
suspectus
7
Это если для Linux .
Пол Варгас
1
Точнее, это относится к GNU date. Версия BusyBox печатает что-то бессмысленное, "%: z CEST" в моем случае.
Лео Лам
Тем не менее, дата +% z отлично работает на OS X. Я предлагаю вам изменить ответ.
Нил Мэйхью
1
Привет, @NeilMayhew Спасибо! Хм ... но вопрос имеет тегиlinux ubuntu-10.04
Пол Варгас
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 {}" \;

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

Руп
источник
4
find /usr/share/zoneinfo/ -type f| xargs md5sum | grep $(md5sum /etc/localtime | cut -d' ' -f1)
freiheit
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 иногда работают лучше, в зависимости от того, как вы хотите это использовать.

Tagar
источник
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-миллионного года.

Руп
источник
1

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

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

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

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

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

ТИКА
источник
0

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

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

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

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

TekOps
источник
0

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

Рекомендации: в этом ответе .

Том Хейл
источник
0

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

date +'%d/%m/%Y  %H:%M:%S [%:z  %Z]'
Мохсен Абаси
источник