Existe-t-il un moyen de vérifier le fuseau horaire dans lequel je suis actuellement sur Linux?
Existe-t-il un moyen de vérifier le fuseau horaire dans lequel je suis actuellement sur Linux?
Réponses:
Habituellement, la TZ
variable d'environnement vous dira quelque chose d'utile. Cependant, il est préférable d’utiliser des fonctions telles que mktime()
et localtime()
de convertir entre time_t
et une représentation de fuseau horaire local. C'est-à-dire, n'essayez pas de faire la conversion vous-même .
date
je vais vous dire.
echo $TZ
ne me rapporte rien.
Si vous voulez dire depuis la console, tapez simplement:
date +%Z
+07
pour moi. Pour obtenir Region/City
un Linux basé sur Debian / Arch, voyez cette réponse .
Si vous voulez le fuseau horaire numérique:
date +'%:z %Z'
Exemple de sortie:
-05:00 EST
:z EST
date
. La version BusyBox affiche quelque chose de non sensuel, "%: z CEST" dans mon cas.
linux
ubuntu-10.04
Je voulais trouver le fuseau horaire sous la forme "US / Eastern" ou "Europe / London" à la place. Vous pouvez le trouver dans:
ZONE="US/Eastern"
dans / etc / sysconfig / clockou vous pouvez essayer de faire correspondre / etc / localtime à l'un des fichiers sous / usr / share / zoneinfo; ennuyeusement cela ne semble pas être un lien symbolique, mais vous pouvez par exemple
cd / usr / share / zoneinfo
find * -type f -exec sh -c "diff -q / etc / localtime '{}'> / dev / null && echo {}" \;
pour trouver des fichiers correspondants - il existe probablement de meilleures façons de le faire, mais cela fonctionne. Il y aura plusieurs correspondances.
find /usr/share/zoneinfo/ -type f| xargs md5sum | grep $(md5sum /etc/localtime | cut -d' ' -f1)
Pour Ubuntu, essayez ceci:
$ cat /etc/timezone
Exemple de sortie:
Asia/Kolkata
Pour une autre distribution, consultez la référence: https://unix.stackexchange.com/questions/110522/timezone-setting-in-linux
timedatectl set-timezone
ne met pas à jour/etc/timezone
. Voir cette réponse pour une solution basée sur /etc/localtime
.
Parfois , vous pouvez rechercher le fuseau horaire canonique plutôt que la forme courte que produit par date %Z
exemple US/Eastern
. Sur les systèmes avec, timedatectl
par exemple, Fedora, timedatectl
génère de nombreuses informations utiles, y compris la zone actuelle:
# 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
Malheureusement, timedatectl
prend set-timezone
comme une commande, mais n'a pas de correspondance get-timezone
. Analyser comme suit:
# timedatectl status | grep "zone" | sed -e 's/^[ ]*Time zone: \(.*\) (.*)$/\1/g'`
US/Eastern
$ strings /etc/localtime | tail -n 1
MST7MDT,M3.2.0,M11.1.0
Donc, je suis à l'heure de la montagne. Bien que les conseils ci-dessus sur l'utilisation de variables d'environnement ou simplement la sortie de commandes de date fonctionnent parfois mieux, selon l'utilisation que vous souhaitez en faire.
Pour le fuseau horaire, vous pouvez utiliser la géolocalisation:
$ curl https://ipapi.co/timezone
America/Chicago
Ou:
$ curl http://ip-api.com/line?fields=timezone
America/Chicago
/sbin/hwclock --systohc [--utc]
pour régler l'horloge matérielle.Le noyau Linux enregistre et calcule toujours le temps en secondes depuis le 1er janvier 1970 à minuit (minuit), indépendamment du fait que votre horloge matérielle soit stockée en UTC ou non. Les conversions à votre heure locale sont effectuées au moment de l'exécution. Une bonne chose à ce sujet est que si quelqu'un utilise votre ordinateur à partir d'un fuseau horaire différent, il peut définir la variable d'environnement TZ et toutes les dates et heures apparaîtront correctes pour son fuseau horaire.
Si le nombre de secondes écoulées depuis le 1er janvier 1970 UTC est stocké sous la forme d'un entier signé 32 bits (comme c'est le cas sur votre système Linux / Intel), votre horloge cessera de fonctionner en 2038. Linux n'a pas de problème Y2K inhérent. , mais il a un problème d’année 2038. J'espère que nous utiliserons tous Linux sur des systèmes 64 bits d'ici là. Les entiers 64 bits garderont nos horloges bien fonctionner jusqu’à environ 292271 millions d’années.
L'utilisation de TZ ou de la date n'est pas fiable car elle vous indique le fuseau horaire de l'utilisateur, et non le fuseau horaire par défaut du système.
Le fuseau horaire système par défaut est stocké dans / etc / timezone (qui est souvent un lien symbolique vers le fichier de données de fuseau horaire spécifique au fuseau horaire). Si vous n'avez pas de / etc / timezone, regardez / etc / localtime. Généralement, il s'agit du fuseau horaire du "serveur". / etc / localtime est souvent un lien symbolique vers un fichier de fuseau horaire dans / usr / share / zoneinfo. Ce chemin d'accès au fichier de fuseau horaire correct vous fournira souvent aussi des informations géographiques.
Les nouveaux linux ont "timedatectl" qui vous donne des tonnes d'informations lorsque la commande est exécutée.
(en tant que nœud latéral, si vous avez un ancien système qui utilise toujours les fuseaux horaires codés en dur OLD, vous pouvez probablement copier un fichier de fuseau horaire moderne sur celui-ci et cela fonctionnera. J'ai dû le faire plusieurs fois pour résoudre le changement de fuseaux horaires. sur du matériel ancien).
Parfois, timedatectl set-timezone
ne met pas à jour/etc/timezone
, il est donc préférable d'obtenir la tiemzone à partir du nom du fichier vers lequel le lien symbolique /etc/timezone
pointe:
#!/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
Références: dans cette réponse .
Vous pouvez afficher la date et le fuseau horaire simultanément:
date +'%d/%m/%Y %H:%M:%S [%:z %Z]'