¿Cuáles son las abreviaturas de zona horaria “estándar”?

14 minutos de lectura

¿Cuáles son las abreviaturas de zona horaria "estándar"?
ABlankenship

Estoy almacenando la zona horaria por compensación de UTC para una aplicación usando 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 &amp; 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 en abreviaturas de zona horaria, mi única opción para hacerlo mediante programación sería revisar una lista de aproximadamente 400 abreviaturas de zona horaria. ¿Alguien sabe la lista que acompaña a este menú desplegable de cada una de las zonas horarias y cuáles son cuando está en marcha el horario de verano? (Supongo que necesito definir ambas listas manualmente)

EDITAR: analizó esta lista en un solo abbr para cada zona horaria, pero no son los “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);

  • Echa un vistazo a DateTimeZone::listAbreviaturas. La información que desea probablemente esté allí, o en uno de los métodos relacionados.

    usuario1864610

    23 de agosto de 2013 a las 14:30

  • Esa es la lista de 400 abreviaturas que no puedo analizar cada carga de página. Solo necesito estos 24, supongo que hay una lista común en algún lugar que no he podido encontrar. Este menú desplegable en particular fue incluso difícil de encontrar, los otros no eran tan agradables. :/

    – ABlankenship

    23 de agosto de 2013 a las 14:37

  • Puede crear su lista programáticamente y almacenarla en el sistema de archivos del servidor. Cuando lo necesite, verifique su antigüedad y reconstrúyalo si tiene más de, digamos, 24 horas. A continuación, inclúyalo o exíjalo de la forma habitual. No es la lista que solicita, pero significa que solo analiza la lista completa una vez al día.

    usuario1864610

    23 de agosto de 2013 a las 14:43


  • Pude analizar la lista, sin embargo, no recibo las abreviaturas populares, solo la primera que coincide. Tenga en cuenta que para las 4 zonas horarias principales de EE. UU., no obtengo PST, MST, CST, EST, sino algo completamente diferente. EDITAR: publicación principal actualizada ya que el código no encaja.

    – ABlankenship

    23 de agosto de 2013 a las 15:21


  • Almacenar la zona horaria por desplazamiento es un error. Guárdelo usando el nombre dado en la lista a la que Mike W se vinculó. A continuación, puede utilizar el FechaHoraZona para acceder a ella. De esa manera evitará problemas con DST, etc. En cualquier caso, hay una lista de abreviaturas aquí que te puede servir.

    – vascoblanco

    23 de agosto de 2013 a las 15:31


¿Cuáles son las abreviaturas de zona horaria "estándar"?
Matt Johnson-pinta

¿Cuáles son las abreviaturas de zona horaria “estándar”?

No hay estándares para esto. Las abreviaturas de zona horaria no están coordinadas oficialmente por nadie. Hay algunos usados ​​en el IANA TZDB, pero muchos de ellos fueron elegidos al azar. A menudo hay debate sobre qué abreviaturas deben usarse. Por ejemplo, mira cuántas publicaciones hubo sobre abreviaturas australianas. en la lista de archivos de abril de 2013.

Se 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” u “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 pueden preferir AESTpero quien puede decir eso A debe ser para Australia y no para América?

Otro ejemplo muy común, algunas personas usan HAST para Hawái, mientras que otros usan HST porque les importan menos las islas Aleutianas en Alaska (que es lo que el A se supone que representa).

El punto es que cualquier lista de abreviaturas de zona horaria, donde sea que encuentre una, será subjetiva y obstinada. No hay estándar.

Estoy almacenando la zona horaria por compensación para una aplicación usando este menú desplegable:

Por favor no Haz eso. Una zona horaria es no un desplazamiento, y hay muchos más de 24 de ellos. Lea la wiki de etiquetas de zona horaria, especialmente la sección titulada “Zona horaria! = Desplazamiento”.

De tus comentarios:

Me doy cuenta de esto ahora, sin embargo, el resto de la lógica de mi aplicación ya depende 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 puede hacer esto de manera confiable, ni siquiera si su 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 debe codificar nada. Las reglas de zona horaria 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 para el Base de datos de zonas horarias de la IANA. Por el lado de PHP, el Documentación PHP deja en claro qué versión está disponible actualmente y que las actualizaciones se manejan a través de Zona horaria de PECL – que extrae sus datos de IANA.

Con respecto a lo que es “popular”, eso también es muy subjetivo. Las zonas en la TZDB están todas allí por una razón u otra. El único lugar que conozco que ha intentado limitar esto es Soporte activo::Zona horaria de Ruby on Rails. Afirman tener un “subconjunto significativo de 146 zonas”, que se puede ver en el MAPPING constante en esa página. Pero no dicen por qué proceso han decidido lo que se considera significativo, y hay omisiones claras. 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 la TZDB, puede probar uno de estos enfoques:

  • Regalo dos Listas deplegables. 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::listIdentifiersacepta una opción $country parámetro para filtrar la lista.

    Un buen ejemplo de esto está en la configuración de Google Calendar:

    Configuración de la zona horaria del calendario de Google

  • Use un control basado en mapas para que su usuario pueda seleccionar su zona horaria por ubicación. Hay muchos de estos por ahí, pero mi favorito es Éste para JavaScript.

    Por ejemplo, podría verse así:

    Selector de TZ basado en mapas

Tenga en cuenta que si bien muestra la abreviatura TZDB de EDT aquí, que solo se usa para una comodidad de visualización. Debajo del capó, está seleccionando un valor como America/New_York.

En última instancia, lo que debe guardar para cada usuario es su clave de zona horaria IANA, como America/New_York. No puede realizar conversiones de zona horaria correctas con solo un valor de -5porque no tiene todas las reglas de cuándo cambiará a -4.

Actualizar

Una cosa de la que no me di cuenta en su publicación original, pero que aclaró en los comentarios, es que está usando esto para elegir una zona horaria de evento de destino. Supongo que debería haber pedido contexto primero. Estaba abordando esto desde la perspectiva de elegir una única zona horaria para su usuario, en lugar de una zona horaria específica para un evento en particular.

todo lo que De Verdad la necesidad de que un evento esté en el momento correcto es el desplazamiento para ese momento. Entonces, podría usar un menú desplegable como el que mostró en su pregunta, pero omitiría los nombres de las zonas. Literalmente sería una lista de compensaciones de UTC-12:00 para UTC+14:00. Parece que ya ha identificado que también existe una compensación de 30 y 45 minutos. Puedes verificar tus suposiciones aquí Si te gusta.

Sin embargo, el problema general es que muchas personas no saber cuál debe ser el desplazamiento. Poniendo una lista con los estándar compensación para cada nombre de zona, podría engañar al usuario para que elija la compensación incorrecta. Por ejemplo, podrían estar hablando de una fecha en el verano que debería coincidir con el horario de verano del este de EE. UU. (-4), pero eligen la selección -5 en su lugar porque ven “Este”. Así que eliminar los nombres ayudará.

Si sigue el camino que sugerí originalmente y les pide que elijan una zona horaria real de la IANA, eso funcionará mucho mejor para muchos escenarios. Sin embargo, todavía hay un escenario en el que debe pensar: cómo manejar ambiguo y inválido veces. Esto sucede durante las transiciones de DST.

Por ejemplo, podría seleccionar America/New_York, y elija una hora para la 1:00 a. m. del 3 de noviembre de 2013. Hay dos instancias diferentes debido a la transición alternativa (una en EDT a -4 y otra en EST a -5). Por lo tanto, su aplicación debería verificar esto y preguntarle al usuario a cuál de los dos se refería. Asimismo, si entro a las 2:00 a. m. del 10 de marzo de 2013, su aplicación debería indicarme que esta hora no existe en esa zona (debido a la transición de primavera hacia adelante).

Con cualquiera de los enfoques, cuando se trata de almacenar las horas de los eventos, asegúrese de almacenar la combinación de fecha-hora-compensación, o aplique la compensación para obtener una fecha-hora que esté en UTC. No desea que haya ninguna duda sobre qué momento real en el tiempo representa el evento.

  • Vaya, gran respuesta. Tú ganas, yo arreglaré todo lol. Sin embargo, fue decepcionante porque mis temporizadores de cuenta regresiva y demás funcionaron bien en todas mis pruebas (al menos dentro de los EE. UU.). Solo necesito mostrar el ABBR junto a la hora ahora. Supongo que esta es una mejor manera de hacerlo. Lo que estoy haciendo es como eventos en vivo, por lo que un usuario puede tener varios de ellos, no es como si un usuario selecciona su propia zona horaria una vez y eso es todo, podrían ser varias veces y podrían tener varios eventos en otros países para todos. sé, así que quería mantenerlo simple. la selección País + Zona horaria debería funcionar bien. ¡Gracias!

    – ABlankenship

    23 de agosto de 2013 a las 16:47

  • Además, según su último párrafo, solucioné esto haciendo que JavaScript le mostrara al usuario en qué zona horaria se encontraba actualmente, para que pudiera seleccionar -4 para EDT (UTC) aunque -5 es el código GMT correcto para esa zona. Un poco raro, pero funcionó para los eventos que se avecinaban en un futuro cercano antes de que cambiara.

    – ABlankenship

    23 de agosto de 2013 a las 16:52

  • GMT/UTC son los mismos para este propósito. No es que -5 sea correcto, simplemente es el desplazamiento “estándar” o “base”. Incluso ese ejemplo de Google Calendar se equivoca al mostrar el desplazamiento estándar, no el actual o (en su caso) el que se aplica a la hora del evento. Ver mi respuesta actualizada también.

    – Matt Johnson-Pint

    23 de agosto de 2013 a las 18:01


  • Si necesita adjuntar un nombre, lo convertiría en el nombre de la zona real como America/New_Yorko un nombre común como Eastern Time. Pero también tienes que lidiar con los escenarios ambiguos/no válidos que describí. Si necesita una fuente oficial de nombres para usar, busque “metazonas” en el CLDR.

    – Matt Johnson-Pint

    23 de agosto de 2013 a las 18:14

  • ¡Respuesta impresionante! Debe enviarse a UX.SE sobre cómo elegir la zona horaria.

    – Dan Dascalescu

    3 de marzo de 2014 a las 10:49

¿Ha sido útil esta solución?