Ho un server in esecuzione con il fuso orario impostato su UTC
. Sembrava che fosse generalmente una buona pratica (correggimi se sbaglio).
Comunque, uno dei server a cui mi collego, per scp
file, è in esecuzione su EDT
e memorizza i file che devo copiare nel formato /path/to/filename/data20120913
Ho esaminato il tentativo di rsync
file utilizzando qualcosa come -mtime -1
di find flag per i file modificati nell'ultimo giorno, ma non ho avuto fortuna.
Non mi dispiace usare solo scp
per copiare il file del giorno corrente, ma al momento c'è una finestra di 4 ore in cui eseguire date +%Y%m%d
darà un giorno diverso su ogni server e questo mi infastidisce un po'.
Sfogliando man date
Vedo che posso avere l'output dell'ora come UTC
, ma non vedo un modo per visualizzarlo come un altro fuso orario come EDT
Suppongo che potrei anche usare qualcosa come GNU
estensione di data date -d 20100909 +%s
per ottenere la data in secondi dall'epoca, applica un manuale 4 * 60 * 60
secondo calcolo e vedi come renderla come una data, ma poi quando entra in gioco l'ora legale sarà ancora un'ora libera.
C'è un modo più semplice per generare la data in un YYYYMMDD
formato per EDT
su un server impostato su UTC
?
Risposta accettata:
Puoi impostare un fuso orario per la durata della query, così:
TZ=America/New_York date
Nota lo spazio bianco tra il TZ
impostazione e la date
comando. In stile Bourne e rc
-like shell, che imposta il TZ
variabile solo per la riga di comando. In altre shell (csh
, tcsh
, fish
), puoi sempre utilizzare env
comando invece:
env TZ=America/New_York date
tl;dr
Su sistemi Linux. i fusi orari sono definiti nei file in /usr/share/zoneinfo
directory. Questa struttura viene spesso chiamata "database Olson" per onorare il suo contributore fondatore.
Le regole per ciascun fuso orario sono definite come righe di file di testo che vengono quindi compilate in un file binario. Le righe così compilate definiscono il nome della zona; un intervallo di dati e di tempo durante il quale si applica la zona; un offset da UTC per l'ora standard; e la notazione per definire come avviene la transizione da e verso l'ora legale, se applicabile.
Ad esempio, la directory "America" contiene le informazioni necessarie per New York nel file America/New_York
come usato, sopra.
Fai attenzione che la specifica di una zona inesistente (nome file) viene ignorata silenziosamente e vengono riportati gli orari UTC. Ad esempio, questo segnala un'ora errata:
TZ="America/New York" date ### WRONG ###
La specifica UNIX singola, versione 3, nota come SUSv3 o POSIX-2001, rileva che per la portabilità, la stringa di caratteri che identifica la descrizione del fuso orario deve iniziare con i due punti. Quindi, possiamo anche scrivere:
TZ=":America/New_York" date
TZ=":America/Los_Angeles" date
Come metodo alternativo alla specifica dei fusi orari utilizzando un percorso per un file di descrizione, SUSv3 descrive il modello POSIX. In questo formato, una stringa è definita come:
std offset [dst[offset][,start-date[/time],end-date[/time]]]
dove std
è il nome del componente standard e dst
è l'ora legale. Ogni nome è composto da tre o più caratteri. Il offset
è positivo per i fusi orari a ovest del primo meridiano e negativo per quelli a est del meridiano. L'offset viene aggiunto all'ora locale per ottenere UTC (precedentemente noto come GMT). L'start
e end
i campi dell'ora indicano quando si verificano le transizioni standard/luce diurna.
Ad esempio, negli Stati Uniti orientali, l'ora solare è 5 ore prima dell'ora UTC e possiamo specificare EST5EDT
al posto di America/New_York
. Tuttavia, queste alternative non sono sempre riconosciute, soprattutto per le zone al di fuori degli Stati Uniti, ed è meglio evitarle.
HP-UX (un UNIX conforme a SUSv3) utilizza regole testuali in /usr/lib/tztab
e i nomi POSIX come EST5EDT, CST6CDT, MST7MDT, PST8PDT. Il file include tutte le regole storiche per ogni fuso orario, simili al database Olson.
NOTA: Dovresti essere in grado di trovare tutti i fusi orari controllando la seguente directory:/usr/share/zoneinfo
.