2012-09-20 34 views
10

Esiste un modo per ottenere il nome del fuso orario Canonical da uno script di shell Linux? per esempio, se il mio fuso orario configurato è PDT, allora mi piacerebbe ottenere "America/Los_Angeles".Acquisizione del nome del fuso orario Canonical nello script shell

So che potrei ottenere dal collegamento simbolico/etc/localtime se fosse configurato, ma poichè potrebbe non essere configurato in tutti i server non posso fare affidamento su quello.
D'altra parte, posso ottenere il nome del fuso orario breve con la data del comando +% Z, ma ho ancora bisogno del nome canonico.

C'è un modo per ottenere il nome canonico del fuso orario corrente o trasformare il fuso orario ottenuto con il comando data +% Z, anche se il collegamento simbolico/etc/localtime non è impostato?

+1

direi 'PDT' è più vicino a un nome canonico, mentre 'America/Los_Angeles' è solo un'etichetta descrittiva per la mappatura di una posizione per il fuso orario corretto. – chepner

+1

Non penso sia possibile; una singola abbreviazione, anche se espansa senza ambiguità (ad esempio in "Pacific Daylight Time"), può avere più voci corrispondenti del database TZ. Ad esempio, PDT non è solo "America/Los_Angeles', ma anche" America/Dawson "," America/Ensenada "," America/Sitka "," America/Tijuana "," America/Vancouver "," America/Whitehorse ". e 'US/Pacifico'. (In effetti, se non avessi specificato che volevi "America/Los_Angeles', avrei pensato che volessi" Stati Uniti/Pacifico ".) – ruakh

risposta

19

Questo è più complicato di quanto sembri. La maggior parte delle distribuzioni Linux lo fanno in modo diverso quindi non esiste un modo affidabile al 100% per ottenere il nome di Olson TZ.

Di seguito si riporta l'euristica che ho usato in passato:

  1. selezionare/etc/fuso orario, se esiste usarlo.
  2. controllo Avanti se/etc/localtime è un collegamento simbolico al database fuso orario
  3. Altrimenti trovare un file in/usr/share/zoneinfo con lo stesso contenuto del file/etc/localtime

testato codice di esempio:

if [ -f /etc/timezone ]; then 
    OLSONTZ=`cat /etc/timezone` 
elif [ -h /etc/localtime ]; then 
    OLSONTZ=`readlink /etc/localtime | sed "s/\/usr\/share\/zoneinfo\///"` 
else 
    checksum=`md5sum /etc/localtime | cut -d' ' -f1` 
    OLSONTZ=`find /usr/share/zoneinfo/ -type f -exec md5sum {} \; | grep "^$checksum" | sed "s/.*\/usr\/share\/zoneinfo\///" | head -n 1` 
fi 

echo $OLSONTZ 

Si noti che questo esempio veloce non gestisce il caso in cui più nomi TZ corrispondono al file data (quando si cerca in/usr/share/zoneinfo). La disambiguazione del nome TZ appropriato dipenderà dalla tua applicazione.

-Nick

+0

Beh, non è esattamente quello che stavo cercando, ma funzionerà. Grazie :) –

Problemi correlati