Existe-t-il un moyen de vérifier le fuseau horaire dans lequel je suis actuellement sur Linux?
Habituellement, la variable d'environnement TZ
vous dira quelque chose d'utile. Cependant, il est préférable d'utiliser des fonctions telles que mktime()
et localtime()
pour 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 .
Si vous voulez dire depuis la console, tapez simplement:
date +%Z
Si vous voulez le fuseau horaire numérique:
date +'%:z %Z'
Exemple de sortie:
-05:00 EST
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.
Pour Ubuntu, essayez ceci:
$ cat /etc/timezone
Exemple de sortie:
Asia/Kolkata
Pour une autre distribution, reportez-vous à: https://unix.stackexchange.com/questions/110522/timezone-setting-in-linux
Parfois, vous pouvez rechercher le fuseau horaire canonique plutôt que la forme abrégée telle que produite par date %Z
p. Ex. US/Eastern
. Sur les systèmes avec timedatectl
par ex. Fedora, timedatectl
fournit 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
en tant que commande, mais n'a pas de get-timezone
correspondant. 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.
/sbin/hwclock --systohc [--utc]
pour régler l'horloge matérielle.Le noyau Linux enregistre et calcule toujours l'heure sous forme de nombre de secondes écoulées depuis le 1er janvier 1970 UTC à minuit, que votre horloge matérielle soit ou non enregistrée en tant que l'heure UTC. 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 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.
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
Quelques solutions:
date +"%Z %z"
timedatectl | grep "Time zone"
cat /etc/timezone
m'a donné (respectivement):
UTC +0000
Time zone: Etc/UTC (UTC, +0000)
Etc/UTC
Mon ordinateur est au format UTC.
Vous pouvez afficher la date et le fuseau horaire simultanément:
date +'%d/%m/%Y %H:%M:%S [%:z %Z]'
Utilisation de TZ ou de date IS NOT FIABIABLE car il 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 le fuseau horaire à 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: in this answer .