2011-02-11 10 views
7

Toda la zona horaria en Windows se visualizan de tal manera comoLinux- Windows Timezone Mapping?

(GMT+10:00) Canberra, Melbourne, Sydney,

GMT y Offset y el lugar. A su vez, Linux está teniendo cada zona horaria como mapeo de directorio en/usr/share/zoneinfo/[Continent]/[Place].

Necesito mapear cada zona horaria de Windows a la zona horaria de Linux para mi aplicación. como

(GMT+05:30) Chennai, Kolkata, Mumbai, New Delhi => Asia/Calcutta 

Ahora la superficie problema para el International Date Line West que se encuentra entre Rusia y Estados Unidos. En Windows, está marcado por (GMT-12: 00) International Date Line West y de varias fuentes encontré que en Linux es Etc/GMT + 12.

(GMT-12:00) International Date Line West => Etc/GMT+12 

también

(GMT+12:00) Coordinated Universal Time+12 => Etc/GMT-12 
(GMT-02:00) Coordinated Universal Time-02 => Etc/GMT+2 
(GMT-11:00) Coordinated Universal Time-11 => Etc/GMT+11 

Esto me mantiene intrigado y mi aplicación trabaja en estrecha colaboración con la marca de hora UTC w.r.t y el desplazamiento UTC. Entonces este mapeo me confunde a mí y a la aplicación.

¿Alguien puede explicar por qué hay un viceversa de -12 y +12 Offset en ambos para un mismo lugar?

Gracias de antemano :)

Respuesta

20

Unicode.org aloja un mapeo como parte del CLDR. You can get to the latest version here. También hay versiones XML de los datos vinculados desde esa página.

Puede encontrar el código de ejemplo (en Python) de cómo generar una asignación a partir de los datos XML here.

obligatorio zona horaria Rant:

Nota que quien implementado el soporte de zona horaria en Windows estaba drogado. No te estoy tomando el pelo. Mira los nombres de la zona horaria. ¿Por qué la época centroeuropea se conoce como "Tiempo estándar romance"? ¿Romance? ¿Qué, porque incluye París, o? Roman Standard Time podría haber tenido sentido si también incluye a Roma, ¿pero Romance?

Además, en el registro las zonas horarias no están organizadas en su id. No, están increíblemente organizados bajo su nombre de visualización ! Como eso está localizado, significa que cada zona horaria se ubicará bajo una clave diferente en diferentes traducciones de Windows. Entonces, para encontrar la zona horaria correcta, debe buscar en toda la zona horaria para ver cuál tiene la identificación correcta.

Tengo un código de ejemplo de eso también here. Ver la función get_win_timezone().

Me pregunto si es la misma persona que diseñó este que decidió que POSIX debe invertir el signo de zonas horarias, por lo que significan -8 horas más y 8 horas. En cualquier caso, estoy seguro de que estaban fumando algo ilegal juntos.

+0

Gracias Lennart and NullToken :) –

+1

Tenga en cuenta que a partir del 25 de enero de 2013 los datos de zona horaria en unicode.org son al menos 7 años desactualizado Hasta ahora, he encontrado que falta Asia/Kolkata (rebautizado de Asia/Calcuta), América/Indiana/Indianápolis, y América/Kentucky/Louisville. Esto todavía está bien para mapear las zonas horarias de Windows a Linux, pero no utilizaría estos datos para nada más hasta que se solucione. – geofflee

+0

@geofflee: Es desafortunado, no sabía que incluso tuvieran datos de zona horaria, y no veo por qué lo hacen si no lo mantienen actualizado. De todos modos, lo uso solo para el mapeo del nombre de la zona horaria. –

2

Las definiciones en el directorio Etc están destinados a ser el estilo POSIX, por tanto, tienen su signo contrario de lo que cabría esperar. No soy un experto para POSIX, pero hasta donde tengo, la idea básica era expresar timzones mediante la combinación de su nombre local y el desplazamiento a GMT. Un ejemplo para Europa central (Central Europeo Tiempo/CET):

Europe/Berlin (w/o daylight savings) equals GMT+01:00 equals CET-1 

GMT-1 en el directorio Etc, de hecho, describe una zona horaria (fictous) llamado "GMT", que es una hora más que (lo real) GMT.

Hasta donde yo sé, estos archivos solo están ahí para permitirle crear enlaces (simbólicos), de modo que si se encuentra en alguna parte de Europa central, creará un enlace al GMT-1 y lo llamará CET-1.

La mejor recomendación que le puedo dar es ignorar por completo el directorio Etc y usar alguna tabla de asignación de los nombres de las zonas horarias de Windows a las carpetas/archivos de la zona horaria de Unix. La información de la zona horaria de Windows no solo proporciona el desplazamiento a GMT, sino que también conoce el horario de verano (y cuando comienza o termina). Lo mismo es cierto para las carpetas/archivos en la base de datos de la zona horaria, pero no para los archivos en el directorio Etc - dan un desplazamiento estático simple a GMT.

Se puede encontrar una lista de zonas horarias en la base de datos tz in the wikipedia.

+0

:) En sus sugerencias, encontré el verdadero motivo y obtuve la solución :) Gracias Patrick :) –

2

Si todos los archivos tienen los signos invertidos, entonces los archivos que está mirando son desplazamientos hacia adelante, mientras que con lo que probablemente esté más familiarizado es con los desplazamientos de mapeo inverso.

Windows normalmente usa la zona horaria local para el tiempo interno de la máquina, por lo que necesita archivos de zona horaria que puedan volver a traducirse en UTC. Linux generalmente usa UTC como el tiempo interno de la máquina, por lo que necesita archivos de zona horaria que se puedan traducir a la hora local.

Dado que los desplazamientos para las dos máquinas describen direcciones de tiempo complementarias pero opuestas, es lógico pensar que los archivos de zona horaria están inversamente relacionados entre sí. En otras palabras, si recoge un conjunto de archivos de zona de uno, el otro conjunto será negativo.