Як перевірити, який часовий пояс у 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
Точний Панголін echo $TZмені нічого не повертає.
Ієн Самуель Маклін Старший

3
@GregHewgill Ваша відповідь на перший погляд не корисна. Подумайте, будь ласка, відредагуйте відповідь. Дивіться найбільш проголосовану відповідь нижче. Я зараз оскаржу вашу відповідь. Також на моїх машинах за замовчуванням немає TZ env.
therealmarv

244

Якщо ви маєте на увазі з консолі, просто введіть:

date +%Z

2
добре, добре працює.
Срібний Місяць

15
це має бути прийнята відповідь
KalenGi

хороший момент ... змінив відповідь на цей ефект
Расман,

І щоб встановити часовий пояс з командного рядка в Ubuntu, наступне посилання забезпечує тривіальну команду з 1 рядком для цього: askubuntu.com/a/524362/182454
Dan

Це дає +07для мене. Щоб потрапити Region/Cityна Linux на базі Debian / Arch, дивіться цю відповідь .
Том Хейл

54

Якщо потрібно числовий часовий пояс:

date +'%:z %Z'

Вибірка зразка:

-05:00 EST

7
На ОС X це вихід:z EST
підозрюваний

7
Це якщо для Linux .
Пол Варгас

1
Точніше, це стосується GNU date. Версія BusyBox друкує щось нечуттєве, "%: z CEST" у моєму випадку.
Лео Лам

Однак дата +% z працює добре в ОС X. Я пропоную вам змінити відповідь.
Ніл Мейхью

1
Привіт, @NeilMayhew Дякую! Гумм ... але питання має міткиlinux ubuntu-10.04
Пол Варгас

24

Я хотів знайти часовий пояс у формі "США / Схід" або "Європа / Лондон". Ви можете знайти це у:

  • / і т.д. / часовий пояс (присутній на 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

Так що я на гірському часі. Хоча поради, наведені вище щодо використання змінної середовища або просто дати команди, іноді працюють краще, залежно від того, як ви хочете це використовувати.



2
  • / etc / sysconfig / clock встановлює, чи зберігається апаратний годинник як UTC або місцевий час.
  • Symlink / etc / localtime to / usr / share / zoneinfo / ..., щоб встановити свій часовий пояс.
  • Введіть /sbin/hwclock --systohc [--utc]для встановлення апаратного годинника.

Ядро Linux завжди зберігає і обчислює час як кількість секунд з півночі 1 січня 1970 року UTC, незалежно від того, зберігається ваш апаратний годинник як UTC чи ні. Перетворення на ваш місцевий час здійснюються під час виконання. Одним із них є те, що якщо хтось використовує ваш комп'ютер з іншого часового поясу, він може встановити змінну середовища TZ, і всі дати та часи будуть здаватися правильними для їхнього часового поясу.

Якщо кількість секунд з 1 січня 1970 року UTC зберігається як підписане 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", який дає тони інформації під час виконання команди.

(як бічний вузол, якщо у вас є стародавня система, яка все ще використовує СТАРІ жорсткі кодові часові пояси, ви, ймовірно, можете скопіювати на нього сучасний файл часового поясу, і він спрацює. Мені довелося це робити багато разів, щоб вирішити зміни часових поясів. на старшому обладнанні).


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

Список літератури: у цій відповіді .


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.