C'è un modo per verificare in quale fuso orario sono attualmente su Linux?
C'è un modo per verificare in quale fuso orario sono attualmente su Linux?
Risposte:
Di solito, la TZ
variabile d'ambiente ti dirà qualcosa di utile. Tuttavia, è meglio utilizzare funzioni come mktime()
e localtime()
per convertire tra time_t
e una rappresentazione locale del fuso orario. Cioè, non provare a fare la conversione da solo .
date
lo dirò.
echo $TZ
non restituisce nulla per me.
Se vuoi dire dalla console, basta digitare:
date +%Z
+07
mi dà . Per accedere Region/City
a un Linux basato su Debian / Arch, vedere questa risposta .
Se vuoi il fuso orario numerico:
date +'%:z %Z'
Uscita campione:
-05:00 EST
:z EST
date
. La versione di BusyBox stampa qualcosa di non sensato, "%: z CEST" nel mio caso.
linux
ubuntu-10.04
Volevo trovare il fuso orario nella forma "USA / Est" o "Europa / Londra". Puoi trovarlo in:
ZONE="US/Eastern"
in / etc / sysconfig / clockoppure puoi provare a far corrispondere / etc / localtime a uno dei file in / usr / share / zoneinfo; fastidiosamente questo non sembra essere un collegamento simbolico, ma puoi ad es
cd / usr / share / zoneinfo
find * -type f -exec sh -c "diff -q / etc / localtime '{}'> / dev / null && echo {}" \;
per trovare i file corrispondenti - probabilmente ci sono modi migliori per farlo, ma funziona. Ci saranno più partite.
find /usr/share/zoneinfo/ -type f| xargs md5sum | grep $(md5sum /etc/localtime | cut -d' ' -f1)
Per Ubuntu prova questo:
$ cat /etc/timezone
Uscita campione:
Asia/Kolkata
Per altri riferimenti sulla distro: https://unix.stackexchange.com/questions/110522/timezone-setting-in-linux
timedatectl set-timezone
non si aggiorna/etc/timezone
. Vedi questa risposta per una soluzione basata su /etc/localtime
.
A volte potresti cercare il fuso orario canonico piuttosto che la forma abbreviata prodotta da date %Z
es US/Eastern
. Sui sistemi con timedatectl
ad es. Fedora, timedatectl
genera molte informazioni utili, inclusa la zona corrente:
# 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
Sfortunatamente, timedatectl
prende set-timezone
come comando, ma non ha corrispondenti get-timezone
. Analizzalo come segue:
# timedatectl status | grep "zone" | sed -e 's/^[ ]*Time zone: \(.*\) (.*)$/\1/g'`
US/Eastern
Per il fuso orario, puoi utilizzare la geolocalizzazione:
$ curl https://ipapi.co/timezone
America/Chicago
O:
$ curl http://ip-api.com/line?fields=timezone
America/Chicago
/sbin/hwclock --systohc [--utc]
per impostare l'orologio hardware.Il kernel di Linux memorizza e calcola sempre il tempo come il numero di secondi dalla mezzanotte del 1 ° gennaio 1970 UTC indipendentemente dal fatto che il tuo orologio hardware sia memorizzato come UTC o meno. Le conversioni all'ora locale vengono eseguite in fase di esecuzione. Una cosa interessante di questo è che se qualcuno sta usando il tuo computer da un fuso orario diverso, può impostare la variabile di ambiente TZ e tutte le date e gli orari appariranno corretti per il loro fuso orario.
Se il numero di secondi dal 1 ° gennaio 1970 UTC è memorizzato come un intero con segno a 32 bit (come sul tuo sistema Linux / Intel), il tuo orologio smetterà di funzionare nell'anno 2038. Linux non ha alcun problema intrinseco Y2K , ma ha un problema dell'anno 2038. Spero che avremo tutti Linux su sistemi a 64 bit a quel punto. I numeri interi a 64 bit manterranno i nostri orologi abbastanza bene fino all'incirca nell'anno 292271 milioni.
L'uso di TZ o date NON È AFFIDABILE perché indica il fuso orario dell'utente, non il fuso orario predefinito del sistema.
Il fuso orario di sistema predefinito è memorizzato in / etc / timezone (che è spesso un collegamento simbolico al file di dati del fuso orario specifico del fuso orario). Se non hai un / etc / timezone, guarda / etc / localtime. Generalmente si tratta del fuso orario del "server". / etc / localtime è spesso un collegamento simbolico a un file di fuso orario in / usr / share / zoneinfo. Questo percorso per il file del fuso orario corretto ti fornirà spesso anche informazioni geografiche.
Linux più recenti hanno "timedatectl" che ti dà tonnellate di informazioni quando il comando viene eseguito.
(come nodo laterale, se hai un sistema antico che utilizza ancora i vecchi fusi orari codificati, probabilmente puoi copiare un moderno file del fuso orario su di esso e funzionerà. Ho dovuto farlo molte volte per risolvere il cambiamento dei fusi orari su apparecchiature più vecchie).
A volte timedatectl set-timezone
non si aggiorna/etc/timezone
, quindi è meglio ottenere tiemzone dal nome del file a cui /etc/timezone
punta il collegamento simbolico :
#!/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
Riferimenti: in questa risposta .
Puoi mostrare contemporaneamente la data e il fuso orario:
date +'%d/%m/%Y %H:%M:%S [%:z %Z]'