Чи є спосіб перевірити, в якому часовому поясі я зараз перебуваю в 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 року UTC зберігається як підписане 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", який дає тони інформації під час виконання команди.
(як бічний вузол, якщо у вас є стародавня система, яка все ще використовує СТАРІ жорсткі кодові часові пояси, ви, ймовірно, можете скопіювати на нього сучасний файл часового поясу, і він спрацює. Мені довелося це робити багато разів, щоб вирішити зміни часових поясів. на старшому обладнанні).
Іноді 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
Список літератури: у цій відповіді .
Ви можете одночасно показувати дату та часовий пояс:
date +'%d/%m/%Y %H:%M:%S [%:z %Z]'