Czy istnieje sposób sprawdzenia, w której strefie czasowej aktualnie jestem w systemie Linux?
Czy istnieje sposób sprawdzenia, w której strefie czasowej aktualnie jestem w systemie Linux?
Odpowiedzi:
Zwykle TZ
zmienna środowiskowa powie ci coś pożytecznego. Jednak najlepiej jest używać takich funkcji, jak mktime()
i localtime()
konwertować między time_t
oraz reprezentację lokalnej strefy czasowej. Oznacza to, że nie próbuj dokonywać konwersji samodzielnie .
date
powiem ci.
echo $TZ
nic mi nie zwraca.
Jeśli masz na myśli z konsoli, po prostu wpisz:
date +%Z
+07
mi. Aby uzyskać dostęp Region/City
do systemu Linux opartego na Debian / Arch, zobacz tę odpowiedź .
Jeśli chcesz numeryczną strefę czasową:
date +'%:z %Z'
Przykładowe dane wyjściowe:
-05:00 EST
:z EST
date
. Wersja BusyBox drukuje coś nie sensownego, w moim przypadku „%: z CEST”.
linux
ubuntu-10.04
Zamiast tego chciałem znaleźć strefę czasową w formie „US / Eastern” lub „Europe / London”. Możesz to znaleźć w:
ZONE="US/Eastern"
w / etc / sysconfig / clocklub możesz spróbować dopasować / etc / localtime do jednego z plików w katalogu / usr / share / zoneinfo; denerwująco nie wydaje się to dowiązaniem symbolicznym, ale możesz np
cd / usr / share / zoneinfo
find * -type f -exec sh -c "diff -q / etc / localtime '{}'> / dev / null && echo {}" \;
znaleźć pasujące pliki - prawdopodobnie są na to lepsze sposoby, ale to działa. Będzie wiele dopasowań.
find /usr/share/zoneinfo/ -type f| xargs md5sum | grep $(md5sum /etc/localtime | cut -d' ' -f1)
W przypadku Ubuntu spróbuj tego:
$ cat /etc/timezone
Przykładowe dane wyjściowe:
Asia/Kolkata
W przypadku innych informacji o dystrybucji: https://unix.stackexchange.com/questions/110522/timezone-setting-in-linux
timedatectl set-timezone
się nie aktualizuje/etc/timezone
. Zobacz tę odpowiedź, aby znaleźć rozwiązanie oparte na /etc/localtime
.
Czasami możesz szukać kanonicznej strefy czasowej, a nie krótkiej formy utworzonej date %Z
np US/Eastern
. Przez . W systemach z timedatectl
np. Fedorą timedatectl
wyświetla wiele użytecznych informacji, w tym bieżącą strefę:
# 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 polecenie, ale nie ma odpowiadającego get-timezone
. Analizuj w następujący sposób:
# timedatectl status | grep "zone" | sed -e 's/^[ ]*Time zone: \(.*\) (.*)$/\1/g'`
US/Eastern
W strefie czasowej możesz użyć geolokalizacji:
$ curl https://ipapi.co/timezone
America/Chicago
Lub:
$ curl http://ip-api.com/line?fields=timezone
America/Chicago
/sbin/hwclock --systohc [--utc]
aby ustawić zegar sprzętowy.Jądro Linux zawsze przechowuje i oblicza czas jako liczbę sekund od północy 1 stycznia 1970 roku UTC, niezależnie od tego, czy zegar sprzętowy jest zapisany jako UTC, czy nie. Konwersje na czas lokalny są wykonywane w czasie wykonywania. Jedną fajną rzeczą jest to, że jeśli ktoś używa twojego komputera z innej strefy czasowej, może ustawić zmienną środowiskową TZ, a wszystkie daty i godziny będą wyświetlane poprawnie dla swojej strefy czasowej.
Jeśli liczba sekund od 1 stycznia 1970 r. UTC jest przechowywana jako 32-bitowa liczba całkowita ze znakiem (tak jak w systemie Linux / Intel), Twój zegar przestanie działać w roku 2038. Linux nie ma nieodłącznego problemu z Y2K , ale ma problem z rokiem 2038. Mamy nadzieję, że do tego czasu wszyscy będziemy używać Linuksa na systemach 64-bitowych. 64-bitowe liczby całkowite utrzymają nasze zegary całkiem dobrze do około 292271 milionów lat.
Użycie TZ lub daty NIE JEST NIEZAWODNE, ponieważ informuje o strefie czasowej UŻYTKOWNIKA, a nie o domyślnej systemowej strefie czasowej.
Domyślna systemowa strefa czasowa jest przechowywana w / etc / timezone (która często jest symbolicznym łączem do pliku danych strefy czasowej specyficznego dla strefy czasowej). Jeśli nie masz / etc / timezone, spójrz na / etc / localtime. Ogólnie jest to strefa czasowa „serwera”. / etc / localtime jest często dowiązaniem symbolicznym do pliku strefy czasowej w / usr / share / zoneinfo. Ścieżka do odpowiedniego pliku strefy czasowej często zawiera również informacje geograficzne.
Nowszy linux ma „timedatectl”, który daje mnóstwo informacji, gdy polecenie jest uruchomione.
(jako węzeł boczny, jeśli masz starożytny system, który wciąż korzysta ze starych zakodowanych stref czasowych, 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).
Czasami timedatectl set-timezone
się nie aktualizuje/etc/timezone
, dlatego najlepiej jest pobrać strefę nazw z pliku, na który /etc/timezone
wskazuje dowiązanie symboliczne :
#!/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
Odniesienia: w tej odpowiedzi .
Możesz jednocześnie wyświetlić datę i strefę czasową:
date +'%d/%m/%Y %H:%M:%S [%:z %Z]'