Comment vérifier quel fuseau horaire sous Linux?


Réponses:


19

Habituellement, la TZvariable 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_tet une représentation de fuseau horaire local. C'est-à-dire, n'essayez pas de faire la conversion vous-même .


2
Existe-t-il une commande indiquant le fuseau horaire de l'utilisateur?

26
Bien sûr, dateje vais vous dire.
Greg Hewgill

J'ai deux instances de serveur, si je donne la commande "date" dans les deux serveurs, il affiche une heure différente. Le fuseau horaire pour les deux serveurs est IST, l'heure d'un serveur: lun 11 juil 11:39:31 IST 2011 et autre serveur lun juil 11 10:35:31 IST 2011 .. il y a une différence de 4 minutes

8
Sur Précis, Pangolin echo $TZne me rapporte rien.
Iain Samuel McLean Elder

3
@GregHewgill votre réponse n'est pas utile à première vue. Pensez à éditer votre réponse s'il vous plaît. Voir la réponse la plus votée ci-dessous. Je vais voter votre réponse pour le moment. De plus, il n'y a pas d'environnement TZ par défaut sur mes machines.
therealmarv

244

Si vous voulez dire depuis la console, tapez simplement:

date +%Z

2
bon, fonctionne bien.
Silver Moon

15
cela devrait être la réponse acceptée
KalenGi

bon point ... a changé la réponse à cet effet
Rasman

Et pour définir le fuseau horaire à partir de la ligne de commande dans Ubuntu, le lien suivant fournit la commande triviale d'une ligne à cet effet: askubuntu.com/a/524362/182454
Dan Nissenbaum

Cela donne +07pour moi. Pour obtenir Region/Cityun Linux basé sur Debian / Arch, voyez cette réponse .
Tom Hale

54

Si vous voulez le fuseau horaire numérique:

date +'%:z %Z'

Exemple de sortie:

-05:00 EST

7
Sur OS X cette sortie:z EST
suspectus

7
Ceci si pour Linux .
Paul Vargas

1
Plus précisément, cela s'applique à GNU date. La version BusyBox affiche quelque chose de non sensuel, "%: z CEST" dans mon cas.
Léo Lam

Cependant, date +% z fonctionne correctement sous OS X. Je vous suggère de modifier la réponse.
Neil Mayhew

1
Bonjour @NeilMayhew Merci! Humm ... mais la question a les baliseslinux ubuntu-10.04
Paul Vargas

24

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


4
find /usr/share/zoneinfo/ -type f| xargs md5sum | grep $(md5sum /etc/localtime | cut -d' ' -f1)
Freiheit


6

Parfois , vous pouvez rechercher le fuseau horaire canonique plutôt que la forme courte que produit par date %Zexemple US/Eastern. Sur les systèmes avec, timedatectlpar exemple, Fedora, timedatectlgé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, timedatectlprend set-timezonecomme 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

4
$ 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.



2
  • / 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 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.


1

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.


0

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


0

Parfois, timedatectl set-timezonene 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/timezonepointe:

#!/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 .


0

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

date +'%d/%m/%Y  %H:%M:%S [%:z  %Z]'
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.