Jak sprawdzić, w której strefie czasowej w Linuksie?
Czy istnieje sposób na sprawdzenie, w której strefie czasowej aktualnie znajduję się w Linuksie?
Czy istnieje sposób na sprawdzenie, w której strefie czasowej aktualnie znajduję się w Linuksie?
Jeśli chcesz numeryczną strefę czasową:
date +'%:z %Z'
Wyjście próbne:
-05:00 EST
Zamiast tego chciałem znaleźć strefę czasową w formie “US/Eastern” lub “Europe/Londyn”. Możesz to znaleźć w:
ZONE="US/Eastern"
w /etc/sysconfig/clock Zazwyczaj zmienna środowiskowa TZ
powie Ci coś użytecznego. Jednakże, najlepiej jest użyć funkcji takich jak mktime()
i localtime()
do konwersji pomiędzy time_t
a lokalną reprezentacją strefy czasowej. To znaczy, nie próbuj samemu dokonać konwersji.
Dla ubuntu spróbuj tego :
$ cat /etc/timezone
Wyjście próbki :
Asia/Kolkata
Dla innego dystryktu Odniesienie : https://unix.stackexchange.com/questions/110522/timezone-setting-in-linux
Czasami możesz szukać raczej kanonicznej strefy czasowej niż krótkiej formy, jaką produkuje date %Z
np. US/Eastern
. Na systemach z timedatectl
, np. Fedora, timedatectl
daje wiele użytecznych informacji, w tym bieżącą strefę czasową:
# 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
Niestety, timedatectl
przyjmuje set-timezone
jako komendę, ale nie ma odpowiadającego jej get-timezone
. Przetwarzaj go w następujący sposób:
# timedatectl status | grep "zone" | sed -e 's/^[]*Time zone: \(.*\) (.*)$//g'`
US/Eastern
Dla strefy czasowej można użyć geolokalizacji:
$ curl https://ipapi.co/timezone
America/Chicago
lub:
$ curl http://ip-api.com/line?fields=timezone
America/Chicago
Możesz pokazać datę i strefę czasową jednocześnie:
date +'%d/%m/%Y %H:%M:%S [%:z %Z]'
Czasami timedatectl set-timezone
nie aktualizuje /etc/timezone
, więc najlepiej pobrać tiemzone z nazwy pliku, który symlink /etc/timezone
wskazuje na:
#!/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
Referencje: w tej odpowiedzi .
Używanie TZ lub daty NIE JEST ODPOWIEDZIALNE, ponieważ mówi ona o strefie czasowej UŻYTKOWNIKA, a nie o domyślnej strefie czasowej systemu.
Domyślna strefa czasowa systemu jest przechowywana w /etc/timezone (co często jest symbolicznym łączem do pliku danych strefy czasowej specyficznego dla tej strefy). Jeżeli nie posiadasz pliku /etc/timezone, spójrz na plik /etc/localtime. Ogólnie jest to strefa czasowa “serwera”. /etc/localtime jest często połączeniem z plikiem strefy czasowej w /usr/share/zoneinfo. Ścieżka do właściwego pliku strefy czasowej często daje także informacje geograficzne.
Nowsze linuksy mają “timedatectl”, który daje mnóstwo informacji podczas wykonywania polecenia.
(jako węzeł boczny, jeśli masz starożytny system, który nadal używa twardych stref czasowych OLD, prawdopodobnie możesz skopiować na niego nowoczesny plik strefy czasowej i będzie on działał. Musiałem to robić wiele razy, aby rozwiązać problem zmiany stref czasowych na starszym sprzęcie).