¿Cuáles son las abreviaturas de zona horaria "estándar"?
Estoy almacenando la zona horaria por compensación desde UTC para una aplicación que usa este menú desplegable:
<select id="timezone" name="timezone" >
<option value="-12">[UTC - 12] Baker Island Time</option>
<option value="-11">[UTC - 11] Niue Time, Samoa Standard Time</option>
<option value="-10">[UTC - 10] Hawaii-Aleutian Standard Time, Cook Island Time</option>
<option value="-9.5">[UTC - 9:30] Marquesas Islands Time</option>
<option value="-9">[UTC - 9] Alaska Standard Time, Gambier Island Time</option>
<option value="-8">[UTC - 8] Pacific Standard Time</option>
<option value="-7">[UTC - 7] Mountain Standard Time</option>
<option value="-6">[UTC - 6] Central Standard Time</option>
<option value="-5">[UTC - 5] Eastern Standard Time</option>
<option value="-4.5">[UTC - 4:30] Venezuelan Standard Time</option>
<option value="-4">[UTC - 4] Atlantic Standard Time</option>
<option value="-3.5">[UTC - 3:30] Newfoundland Standard Time</option>
<option value="-3">[UTC - 3] Amazon Standard Time, Central Greenland Time</option>
<option value="-2">[UTC - 2] Fernando de Noronha Time, South Georgia & the South Sandwich Islands Time</option>
<option value="-1">[UTC - 1] Azores Standard Time, Cape Verde Time, Eastern Greenland Time</option>
<option value="0">[UTC] Western European Time, Greenwich Mean Time</option>
<option value="1">[UTC + 1] Central European Time, West African Time</option>
<option value="2">[UTC + 2] Eastern European Time, Central African Time</option>
<option value="3">[UTC + 3] Moscow Standard Time, Eastern African Time</option>
<option value="3.5">[UTC + 3:30] Iran Standard Time</option>
<option value="4">[UTC + 4] Gulf Standard Time, Samara Standard Time</option>
<option value="4.5">[UTC + 4:30] Afghanistan Time</option>
<option value="5">[UTC + 5] Pakistan Standard Time, Yekaterinburg Standard Time</option>
<option value="5.5">[UTC + 5:30] Indian Standard Time, Sri Lanka Time</option>
<option value="5.75">[UTC + 5:45] Nepal Time</option>
<option value="6">[UTC + 6] Bangladesh Time, Bhutan Time, Novosibirsk Standard Time</option>
<option value="6.5">[UTC + 6:30] Cocos Islands Time, Myanmar Time</option>
<option value="7">[UTC + 7] Indochina Time, Krasnoyarsk Standard Time</option>
<option value="8">[UTC + 8] Chinese Standard Time, Australian Western Standard Time, Irkutsk Standard Time</option>
<option value="8.75">[UTC + 8:45] Southeastern Western Australia Standard Time</option>
<option value="9">[UTC + 9] Japan Standard Time, Korea Standard Time, Chita Standard Time</option>
<option value="9.5">[UTC + 9:30] Australian Central Standard Time</option>
<option value="10">[UTC + 10] Australian Eastern Standard Time, Vladivostok Standard Time</option>
<option value="10.5">[UTC + 10:30] Lord Howe Standard Time</option>
<option value="11">[UTC + 11] Solomon Island Time, Magadan Standard Time</option>
<option value="11.5">[UTC + 11:30] Norfolk Island Time</option>
<option value="12">[UTC + 12] New Zealand Time, Fiji Time, Kamchatka Standard Time</option>
<option value="12.75">[UTC + 12:45] Chatham Islands Time</option>
<option value="13">[UTC + 13] Tonga Time, Phoenix Islands Time</option>
<option value="14">[UTC + 14] Line Island Time</option>
Usando PHP, realmente no tengo las opciones más fáciles para convertirlas a abreviaturas de zona horaria, mi única opción para hacerlo mediante programación sería ordenar una lista de aproximadamente 400 abreviaturas de zona horaria. ¿Alguien conoce la lista que acompaña a este menú desplegable de cuáles son cada una de las zonas horarias y cuáles son cuando ocurre el horario de verano? (Supongo que necesito definir ambas listas manualmente)
EDITAR: analizó esta lista en una sola abreviatura para cada zona horaria, pero no son las "populares".
mi nueva lista
[-12] => kwat
[-11] => bst
[-10] => ahst
[-9.5] => ckhst
[-9] => ahdt
[-8] => akdt
[-7] => east
[-6] => cst
[-5] => act
[-4.5] => ant
[-4] => acst
[-3.5] => negt
[-3] => adt
[-2] => addt
[-1] => azost
[-0] => azomt
[1] => bst
[2] => bdst
[3] => amt
[3.5] => irst
[4] => adt
[4.5] => aft
[5] => aktt
[5.5] => ist
[5.75] => npt
[6] => aktst
[6.5] => burt
[7] => almst
[8] => bnt
[8.75] => cwst
[9] => cdt
[9.5] => cast
[10] => chost
[10.5] => cst
[11] => anat
[11.5] => lhst
[12] => anast
[12.75] => chast
[13] => anast
[14] => anast
Código:
$abbr = DateTimeZone::listAbbreviations();
$offsets=array('-12','-11','-10','-9.5','-9','-8','-7','-6',
'-5','-4.5','-4','-3.5','-3','-2','-1','-0','1','2','3','3.5',
'4','4.5','5','5.5','5.75','6','6.5','7','8','8.75','9','9.5',
'10','10.5','11','11.5','12','12.75','13','14');
$new = array();
$count = 0;
$found = false;
while($count < count($offsets))
{
foreach($abbr as $k => $v)
{
foreach($v as $tz)
{
if($tz['offset'] == $offsets[$count]*3600)
{
$new[$offsets[$count]] = $k;
$found = true;
break;
}
}
if($found)
{
$found = false;
break;
}
}
$count++;
}
print_r($new);
¿Cuáles son las abreviaturas de zona horaria "estándar"?
No existen estándares para esto. Las abreviaturas de las zonas horarias no las coordina oficialmente nadie. Hay algunos que se utilizan en IANA TZDB , pero muchos de ellos se eligieron al azar. A menudo existe un debate sobre qué abreviaturas deberían utilizarse. Por ejemplo, mire cuántas publicaciones hubo sobre abreviaturas australianas en los archivos de listas de abril de 2013 .
Puede encontrar otra lista de abreviaturas de zonas horarias aquí . Si miras de cerca, verás que muchos son ambiguos. Por ejemplo, CST
podría ser "hora estándar central" (EE. UU.), "hora estándar de China" o "hora estándar de Cuba". EST
podría ser "Hora estándar del este" (EE. UU.) o "Hora estándar del este" (Australia).
Algunos no australianos podrían preferir AEST
, pero ¿quién puede decir que A
debería ser para Australia y no para Estados Unidos?
Otro ejemplo muy común, algunas personas lo usan HAST
para Hawaii, mientras que otras lo usan HST
porque no les importan las islas Aleutianas en Alaska (que es lo que se A
supone que representan).
El punto es que cualquier lista de abreviaturas de zonas horarias, donde sea que encuentre una, será subjetiva y obstinada. No existe ningún estándar.
Estoy almacenando zona horaria por desplazamiento para una aplicación que usa este menú desplegable:
Por favor no hagas eso. Una zona horaria no es un desplazamiento y hay muchas más de 24. Lea la wiki de etiquetas de zona horaria , especialmente la sección titulada "Zona horaria! = Desplazamiento".
De tus comentarios:
Ahora me doy cuenta de esto, sin embargo, el resto de la lógica de mi aplicación ya depende de esto de esta manera, y solo tengo hoy para completar esto, así que no hay tiempo para cambiarlo.
Entonces muchos errores seguirán estando presentes en su aplicación. Simplemente no puedes hacer esto de manera confiable, ni siquiera si tu aplicación solo se ejecuta en los EE. UU. No importa en qué idioma o plataforma se encuentre, cualquier implementación que haga esto tendrá muchos errores de conversión.
Estoy de acuerdo con codificar estas matrices, simplemente no sé cuáles son las zonas populares fuera de los EE. UU., pensé que esa lista ya existiría en alguna parte.
Cuando se trata de zonas horarias, no deberías codificar nada. Las reglas de las zonas horarias cambian todo el tiempo porque están controladas por políticos en todos los países del mundo. Hay actualizaciones publicadas varias veces al año en la base de datos de zonas horarias de la IANA . En el lado de PHP, la documentación de PHP deja en claro qué versión está disponible actualmente y que las actualizaciones se manejan a través de timezonedb de PECL , que extrae sus datos de IANA.
En lo que respecta a lo que es "popular", eso también es muy subjetivo. Todas las zonas del TZDB están ahí por una razón u otra. El único lugar que conozco que ha intentado limitar esto es ActiveSupport::TimeZone de Ruby on Rails. Afirman tener un "subconjunto significativo de 146 zonas", que puede ver en la MAPPING
constante de esa página. Pero no dicen mediante qué proceso han decidido lo que se considera significativo, y hay claras omisiones. A menos que sepa con certeza dónde se ubicarán todos y cada uno de sus usuarios, no intentaría decidir a qué zonas limitar.
Si lo que busca es algo más que una lista desplegable de las 578 zonas en TZDB, puede probar uno de estos enfoques:
Presenta dos menús desplegables. El primero en seleccionar un país. El segundo para elegir una zona dentro de ese país. En PHP, puedes ver que cuando llamas
DateTimeZone::listIdentifiers
, acepta un$country
parámetro opcional para filtrar la lista.Un buen ejemplo de esto está en la configuración de Google Calendar:
Utilice un control basado en mapas para que su usuario pueda seleccionar su zona horaria por ubicación. Hay muchos de estos, pero mi favorito es este para JavaScript.
Por ejemplo, podría verse así:
Tenga en cuenta que, aunque muestra la abreviatura TZDB de EDT
aquí, solo se utiliza para facilitar la visualización. Debajo del capó, estás seleccionando un valor como America/New_York
.
En última instancia, lo que debe guardar para cada usuario es su clave de zona horaria de la IANA, como America/New_York
. No puede realizar conversiones de zona horaria correctas con solo un valor de -5
, porque no tiene todas las reglas sobre cuándo cambiará a -4
.
Actualizar
Una cosa de la que no me di cuenta en tu publicación original, pero que aclaraste en los comentarios, es que estás usando esto para elegir una zona horaria de evento objetivo. Supongo que debería haber pedido contexto primero. Estaba abordando esto desde la perspectiva de elegir una zona horaria única para su usuario, en lugar de una zona horaria específica para un evento en particular.
Todo lo que realmente necesitas para que un evento tenga lugar en el momento correcto es el desplazamiento para ese momento. Entonces podrías usar un menú desplegable como el que mostraste en tu pregunta, pero omitiría los nombres de las zonas. Literalmente sería una lista de compensaciones desde UTC-12:00
hasta UTC+14:00
. Parece que ya has identificado que también existe un desplazamiento de 30 y 45 minutos. Puede verificar sus suposiciones aquí si lo desea.
Sin embargo, el problema general es que mucha gente no sabe cuál debería ser la compensación. Al colocar una lista con el desplazamiento estándar para cada nombre de zona, podría inducir a error al usuario a elegir el desplazamiento incorrecto. Por ejemplo, podrían estar hablando de una fecha en el verano que debería caer en el horario de verano del este de EE. UU. (-4), pero eligen la selección -5 porque ven "Este". Por lo tanto, eliminar los nombres será útil.
Si sigue el camino que sugerí originalmente y les pide que elijan una zona horaria real de la IANA, funcionará mucho mejor en muchos escenarios. Sin embargo, todavía hay un escenario en el que debes pensar: cómo manejar tiempos ambiguos e inválidos . Esto sucede durante las transiciones de horario de verano.
Por ejemplo, podría seleccionar America/New_York
y elegir la hora 1:00 a. m. del 3 de noviembre de 2013. Hay dos casos diferentes de esto debido a la transición de retroceso (uno en EDT a las -4 y otro en EST a -5) . Por lo tanto, su aplicación deberá verificar esto y preguntarle al usuario a cuál de los dos se refiere. Del mismo modo, si entro a las 2:00 a. m. del 10 de marzo de 2013, su aplicación debería decirme que esta hora no existe en esa zona (debido a la transición de primavera hacia adelante).
Con cualquier enfoque, cuando se trata de almacenar las horas del evento, asegúrese de almacenar la combinación de fecha, hora y compensación o aplicar la compensación para obtener una fecha y hora que esté en UTC. No querrás que haya dudas sobre qué momento real representa el evento.