J'ai un serveur en cours d'exécution avec le fuseau horaire défini sur UTC
. Il semblait que c'était généralement une bonne pratique (veuillez me corriger si je me trompe).
Quoi qu'il en soit, l'un des serveurs auquel je me connecte, afin de scp
fichiers, s'exécute sur EDT
et stocke les fichiers que je dois copier au format /path/to/filename/data20120913
J'ai regardé essayer de rsync
fichiers en utilisant quelque chose comme -mtime -1
de find drapeau pour les fichiers modifiés le dernier jour, mais je n'ai pas eu de chance.
Cela ne me dérange pas d'utiliser scp
pour copier le fichier du jour en cours, mais pour l'instant, il y a une fenêtre de 4 heures où s'exécute date +%Y%m%d
donnera un jour différent sur chaque serveur et ça me dérange un peu.
En parcourant man date
Je vois que je peux avoir l'heure en sortie sous la forme UTC
, mais je ne vois pas comment le faire sortir comme un autre fuseau horaire comme EDT
Je suppose que je pourrais aussi utiliser quelque chose comme le GNU
extension de date date -d 20100909 +%s
pour obtenir la date en secondes de l'époque, appliquez un manuel 4 * 60 * 60
deuxième calcul, et voyez comment le rendre comme une date - mais ensuite, lorsque l'heure d'été entrera en vigueur, il y aura toujours une heure de retard.
Existe-t-il un moyen plus simple d'afficher la date dans un format YYYYMMDD
format pour EDT
sur un serveur défini sur UTC
?
Réponse acceptée :
Vous pouvez définir un fuseau horaire pour la durée de la requête, ainsi :
TZ=America/New_York date
Notez l'espace blanc entre le TZ
paramètre et la date
commande. Dans Bourne-like et rc
-like shell, qui définit le TZ
variable uniquement pour la ligne de commande. Dans d'autres shells (csh
, tcsh
, fish
), vous pouvez toujours utiliser le env
commande à la place :
env TZ=America/New_York date
tl;dr
Sur les systèmes Linux. les fuseaux horaires sont définis dans des fichiers dans /usr/share/zoneinfo
annuaire. Cette structure est souvent appelée la "base de données Olson" pour honorer son contributeur fondateur.
Les règles pour chaque fuseau horaire sont définies sous forme de lignes de fichier texte qui sont ensuite compilées dans un fichier binaire. Les lignes ainsi compilées, définissent le nom de la zone; une plage de données et de temps pendant laquelle la zone s'applique ; un décalage par rapport à UTC pour l'heure standard ; et la notation pour définir comment la transition vers et depuis l'heure d'été se produit, le cas échéant.
Par exemple, le répertoire "America" contient les informations nécessaires pour New York dans le fichier America/New_York
tel qu'utilisé, ci-dessus.
Attention, la spécification d'une zone inexistante (nom de fichier) est silencieusement ignorée et les heures UTC sont signalées. Par exemple, ceci signale une heure incorrecte :
TZ="America/New York" date ### WRONG ###
La spécification UNIX unique, version 3, connue sous le nom de SUSv3 ou POSIX-2001, note que pour la portabilité, la chaîne de caractères qui identifie la description du fuseau horaire doit commencer par un caractère deux-points. Ainsi, on peut aussi écrire :
TZ=":America/New_York" date
TZ=":America/Los_Angeles" date
Comme méthode alternative à la spécification des fuseaux horaires à l'aide d'un nom de chemin d'accès à un fichier de description, SUSv3 décrit le modèle POSIX. Dans ce format, une chaîne est définie comme :
std offset [dst[offset][,start-date[/time],end-date[/time]]]
où std
est le nom de composant standard et dst
est celui de l'heure d'été. Chaque nom est composé de trois caractères ou plus. Le offset
est positif pour les fuseaux horaires à l'ouest du premier méridien et négatif pour ceux à l'est du méridien. Le décalage est ajouté à l'heure locale pour obtenir UTC (anciennement connu sous le nom de GMT). Le start
et end
les champs d'heure indiquent quand les transitions standard/heure d'été se produisent.
Par exemple, dans l'est des États-Unis, l'heure standard est 5 heures plus tôt que l'UTC, et nous pouvons spécifier EST5EDT
au lieu de America/New_York
. Cependant, ces alternatives ne sont pas toujours reconnues, en particulier pour les zones en dehors des États-Unis, et il vaut mieux les éviter.
HP-UX (un UNIX compatible SUSv3) utilise des règles textuelles dans /usr/lib/tztab
et les noms POSIX comme EST5EDT, CST6CDT, MST7MDT, PST8PDT. Le fichier comprend toutes les règles historiques pour chaque fuseau horaire, semblable à la base de données Olson.
REMARQUE : Vous devriez pouvoir trouver tous les fuseaux horaires en inspectant le répertoire suivant :/usr/share/zoneinfo
.