2012-09-20 20 views
10

¿Hay alguna manera de obtener el nombre de Canonical Time Zone a partir de un script de shell de Linux? por ejemplo, si mi zona horaria configurada es PDT, me gustaría obtener "America/Los_Angeles".Obteniendo el nombre de la zona horaria de Canonical en el script de shell

Sé que podría obtener del enlace simbólico/etc/localtime si estuviera configurado, pero como podría no estar configurado en todos los servidores, no puedo confiar en ese.
Por otro lado, puedo obtener el nombre de la zona horaria corta con el comando date +% Z, pero aún necesito el nombre canónico.

¿Hay alguna manera de obtener el nombre canónico de la zona horaria actual o transformar la zona horaria obtenida con la fecha +% Z, incluso si el enlace simbólico/etc/localtime no está configurado?

+1

, diría 'PDT' está más cerca de un nombre canónico, mientras que 'America/Los_Angeles' es sólo una etiqueta descriptiva para ayudar a trazar una ubicación para la zona horaria correcta. – chepner

+1

No creo que esto sea posible; una única abreviatura, incluso si se expandió de manera no ambigua (por ejemplo, "Tiempo de luz diurna del Pacífico"), puede tener múltiples entradas de TZ-base de datos correspondientes. Por ejemplo, PDT no es solo 'America/Los_Angeles', sino también' America/Dawson', 'America/Ensenada',' America/Sitka', 'America/Tijuana',' America/Vancouver', 'America/Whitehorse' y 'US/Pacific'. (De hecho, si no especificaste que querías 'America/Los_Angeles', habría asumido que querías' US/Pacific'.) – ruakh

Respuesta

19

Esto es más complicado de lo que parece. La mayoría de las distribuciones de Linux lo hacen de forma diferente, por lo que no existe una forma 100% confiable de obtener el nombre de Olson TZ.

A continuación se muestra la heurística que he utilizado en el pasado:

  1. primer cheque/etc/zona horaria, si es que existe usarlo.
  2. Siguiente verificación si/etc/localtime es un enlace a la base de datos de zona horaria
  3. De lo contrario encontrar un archivo en/usr/share/zoneinfo con el mismo contenido que el archivo/etc/localtime

No comprobado código de ejemplo:

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 

Tenga en cuenta que este ejemplo rápido no maneja el caso en que varios nombres TZ coinciden con el archivo dado (cuando se mira en/usr/share/zoneinfo). La desambiguación del nombre TZ apropiado dependerá de su aplicación.

-Nick

+0

Bueno, no es exactamente lo que estaba buscando, pero funcionará. Gracias :) –

Cuestiones relacionadas