Gibt es eine Möglichkeit zu überprüfen, in welcher Zeitzone ich mich gerade unter Linux befinde?
Gibt es eine Möglichkeit zu überprüfen, in welcher Zeitzone ich mich gerade unter Linux befinde?
Antworten:
Normalerweise TZ
sagt Ihnen die Umgebungsvariable etwas Nützliches. Es ist jedoch am besten, Funktionen wie mktime()
und localtime()
zum Konvertieren zwischen time_t
und einer lokalen Zeitzonendarstellung zu verwenden. Das heißt, versuchen Sie nicht, die Konvertierung selbst durchzuführen .
date
werde ich dir sagen.
echo $TZ
gibt nichts für mich zurück.
Wenn Sie von der Konsole aus meinen, geben Sie einfach Folgendes ein:
date +%Z
+07
für mich. Um Region/City
auf ein Debian / Arch-basiertes Linux zuzugreifen, lesen Sie diese Antwort .
Wenn Sie die numerische Zeitzone wollen:
date +'%:z %Z'
Beispielausgabe:
-05:00 EST
:z EST
date
. Die BusyBox-Version gibt etwas Unsinniges aus, in meinem Fall "%: z CEST".
linux
ubuntu-10.04
Ich wollte die Zeitzone stattdessen in der Form "US / Eastern" oder "Europe / London" finden. Sie finden dies in:
ZONE="US/Eastern"
in / etc / sysconfig / clockoder Sie können versuchen, / etc / localtime mit einer der Dateien unter / usr / share / zoneinfo abzugleichen. ärgerlicherweise scheint dies kein symlink zu sein, aber du kannst zb
cd / usr / share / zoneinfo
find * -Typ f -exec sh -c "diff -q / etc / localtime '{}'> / dev / null && echo {}" \;
passende Dateien zu finden - es gibt wahrscheinlich bessere Möglichkeiten, dies zu tun, aber das funktioniert. Es wird mehrere Übereinstimmungen geben.
find /usr/share/zoneinfo/ -type f| xargs md5sum | grep $(md5sum /etc/localtime | cut -d' ' -f1)
Für Ubuntu versuchen Sie Folgendes:
$ cat /etc/timezone
Beispielausgabe:
Asia/Kolkata
Weitere Informationen zur Distribution finden Sie unter https://unix.stackexchange.com/questions/110522/timezone-setting-in-linux
timedatectl set-timezone
wird nicht aktualisiert/etc/timezone
. In dieser Antwort finden Sie eine Lösung basierend auf /etc/localtime
.
Manchmal suchen Sie nach der kanonischen Zeitzone und nicht nach der Kurzform, wie sie date %Z
z US/Eastern
. Auf Systemen mit timedatectl
zB Fedora werden timedatectl
viele nützliche Informationen ausgegeben, einschließlich der aktuellen Zone:
# 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
Leider timedatectl
nimmt set-timezone
als Befehl, hat aber keine entsprechend get-timezone
. Analysieren Sie es wie folgt:
# timedatectl status | grep "zone" | sed -e 's/^[ ]*Time zone: \(.*\) (.*)$/\1/g'`
US/Eastern
Für die Zeitzone können Sie Geolocation verwenden:
$ curl https://ipapi.co/timezone
America/Chicago
Oder:
$ curl http://ip-api.com/line?fields=timezone
America/Chicago
/sbin/hwclock --systohc [--utc]
, um die Hardware-Uhr einzustellen.Der Linux-Kernel speichert und berechnet die Zeit immer als Anzahl von Sekunden seit Mitternacht des 1. Januar 1970 UTC, unabhängig davon, ob Ihre Hardware-Uhr als UTC gespeichert ist oder nicht. Umrechnungen zu Ihrer Ortszeit werden zur Laufzeit durchgeführt. Eine nette Sache dabei ist, dass, wenn jemand Ihren Computer mit einer anderen Zeitzone verwendet, er die Umgebungsvariable TZ festlegen kann und alle Datums- und Uhrzeitangaben für seine Zeitzone korrekt angezeigt werden.
Wenn die Anzahl der Sekunden seit dem 1. Januar 1970 UTC als vorzeichenbehaftete 32-Bit-Ganzzahl gespeichert ist (wie auf Ihrem Linux / Intel-System), funktioniert Ihre Uhr ab dem Jahr 2038 nicht mehr. Linux hat kein inhärentes Y2K-Problem , aber es hat ein Jahr 2038 Problem. Hoffentlich werden wir bis dahin alle Linux auf 64-Bit-Systemen ausführen. 64-Bit-Ganzzahlen sorgen dafür, dass unsere Uhren bis ungefähr 292271-Millionen gut laufen.
Die Verwendung von TZ oder Datum IST NICHT ZUVERLÄSSIG, da die Zeitzone des BENUTZERS und nicht die Standard-Systemzeitzone angegeben wird.
Die Standard-System-Zeitzone ist in / etc / timezone gespeichert (dies ist häufig eine symbolische Verknüpfung zu der für die Zeitzone spezifischen Datendatei). Wenn Sie keine / etc / timezone haben, schauen Sie unter / etc / localtime nach. Im Allgemeinen ist dies die Zeitzone des Servers. / etc / localtime ist häufig ein Symlink zu einer Zeitzonendatei in / usr / share / zoneinfo. Dieser Pfad zur richtigen Zeitzonendatei gibt Ihnen häufig auch Geografiedaten.
Neuere Linux-Versionen haben "timedatectl", das Ihnen jede Menge Informationen liefert, wenn der Befehl ausgeführt wird.
(Wenn Sie als Nebenknoten ein altes System haben, das immer noch die ALTEN fest codierten Zeitzonen verwendet, können Sie wahrscheinlich eine moderne Zeitzonendatei darauf kopieren, und es wird funktionieren. Ich musste dies viele Male tun, um wechselnde Zeitzonen aufzulösen bei älteren Geräten).
Manchmal wird timedatectl set-timezone
das Update nicht durchgeführt./etc/timezone
Daher ist es am besten, die Zeitzone aus dem Namen der Datei zu ermitteln, auf die der Symlink /etc/timezone
verweist:
#!/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
Referenzen: in dieser Antwort .
Sie können Datum und Zeitzone gleichzeitig anzeigen:
date +'%d/%m/%Y %H:%M:%S [%:z %Z]'