web-dev-qa-db-fra.com

Comment vérifier quel fuseau horaire sous Linux?

Existe-t-il un moyen de vérifier le fuseau horaire dans lequel je suis actuellement sur Linux?

126
Hussy Hussain

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 .

19
Greg Hewgill

Si vous voulez dire depuis la console, tapez simplement:

date +%Z
238
Rasman

Si vous voulez le fuseau horaire numérique:

date +'%:z %Z'

Exemple de sortie:

-05:00 EST
51
Paul Vargas

Je voulais trouver le fuseau horaire sous la forme "US/Eastern" ou "Europe/London" à la place. Vous pouvez le trouver dans:

  • / etc/timezone (présent sur Ubuntu et Red Hat? mais pas par exemple Amazon Linux)
  • (sur les systèmes de style Red Hat) sous la forme ZONE="US/Eastern" dans/etc/sysconfig/clock
  • ou 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.

24
Rup

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

9
Shankar

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
6
Raman
$ 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.

4
Tagar
  • / etc/sysconfig/clock détermine si l'horloge matérielle est stockée au format UTC ou heure locale.
  • Créez un lien symbolique entre/etc/localtime et/usr/share/zoneinfo/... pour définir votre fuseau horaire.
  • Tapez /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.

2
Sam

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

http://wiki.archlinux.org/index.php/time#Time_zone

2
Steven Penny

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.

1
tika

Vous pouvez afficher la date et le fuseau horaire simultanément:

date +'%d/%m/%Y  %H:%M:%S [%:z  %Z]'
0
Mohsen Abasi

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).

0
TekOps

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 .

0
Tom Hale