Moment: No se puede encontrar la abreviatura de la zona horaria de Date.prototype.toString ()

Creado en 6 feb. 2012  ·  33Comentarios  ·  Fuente: moment/moment

Hola, encontré el sitio moment.js a través de un foro e hice clic en él, cuando encontré la prueba unitaria, que falló 2 pruebas, lo que quiero informar aquí:

Agente de usuario:
Mozilla / 5.0 (Windows NT 6.1; WOW64) AppleWebKit / 535.7 (KHTML, como Gecko) Chrome / 16.0.912.77 Safari / 535.7 (Chrome 16.0.912.77 m)

Zona horaria:
UTC + 1

Pruebas fallidas (# 28):
http://pastebin.com/bQsDuxdH

* Título editado por timrwood

Bug

Comentario más útil

Pregunta estúpida: ¿por qué una biblioteca completamente nueva? ¿No es el objetivo de Moment resolver todas las necesidades de manejo de fechas y horas? Si bien los archivos de datos agregan una cantidad de espacio no trivial (y puedo entender separarlos), la nueva biblioteca en sí es <2k, por lo que el espacio no parece ser una razón para separarla.

Parece un poco triste que alguien que simplemente quiera generar una cadena de fecha con una zona horaria tenga que descargar dos bibliotecas separadas y un archivo de datos para hacer lo que Javascript debería tener incorporado.

Además, ¿cómo uso esta nueva combinación de bibliotecas para generar una cadena de fecha simple? Antes podría haber generado:

Sun, 06 Nov 1994 08:49:37 GMT

con:

moment().format('ddd, DD MMM YYYY HH:mm:ss z');

Pero ahora estoy confundido en cuanto a cómo se supone que debo hacer eso sin la opción de formato "z". Cualquier ayuda sería apreciada.

Todos 33 comentarios

Mmm, parece que la abreviatura de la zona horaria está fallando. Lamento hacer la depuración remota, pero ¿cuál es el resultado de lo siguiente en Chrome?

new Date().toString()

Además, ¿cuál es el nombre de la zona horaria en la que se encuentra?

Recibo el mismo error en las pruebas unitarias y también estoy en UTC + 1 (anteriormente conocido como GMT + 1).

new Date (). toString () imprime "Sáb 11 de febrero de 2012 02:15:10 GMT + 0100" en Firefox 10, "Sáb 11 de febrero de 2012 02:18:29 GMT + 0100 (Hora estándar de Europa Occidental)" en Chrome 16 y "Sáb 11 de febrero 02:18:59 UTC + 0100 2012" en Internet Explorer 9

Hmm, tenía miedo de esto. El problema es que Date.prototype.toString devuelve resultados tan diferentes. Ese es el único lugar para obtener el nombre de la zona horaria (PST, CST, EST, etc.). Si este método no devuelve información de zona horaria (como es el caso de FF10 e IE9, no hay forma de obtenerla)

¿Quizás es hora de depreciar? ¿O es aceptable simplemente anotar el problema en los documentos?

4318 pasó, 2 fallaron. 2715 milisegundos.

Mozilla / 5.0 (Windows NT 6.1) AppleWebKit / 535.11 (KHTML, como Gecko) Chrome / 17.0.963.56 Safari / 535.11

UTC +2 (Kiev, Ucrania)

el formato de la zona horaria 2 pasó, 2 falló.
---> Algo como "PST"
AssertionError: ---> Algo como "PST"
en Object.ok (http://momentjs.com/js/tests.js?_=120203_183019:1526:39)
en http://momentjs.com/js/tests.js?_=120203_183019:2413:14
en Object.runTest (http://momentjs.com/js/tests.js?_=120203_183019:1702:9)
en http://momentjs.com/js/tests.js?_=120203_183019:1748:25
en http://momentjs.com/js/tests.js?_=120203_183019:1006:13
en http://momentjs.com/js/tests.js?_=120203_183019:616:13
en http://momentjs.com/js/tests.js?_=120203_183019:627:25
en http://momentjs.com/js/tests.js?_=120203_183019:1008:17
en http://momentjs.com/js/tests.js?_=120203_183019:1589:17
---> Algo como "PST"
AssertionError: ---> Algo como "PST"
en Object.ok (http://momentjs.com/js/tests.js?_=120203_183019:1526:39)
en http://momentjs.com/js/tests.js?_=120203_183019:2414:14
en Object.runTest (http://momentjs.com/js/tests.js?_=120203_183019:1702:9)
en http://momentjs.com/js/tests.js?_=120203_183019:1748:25
en http://momentjs.com/js/tests.js?_=120203_183019:1006:13
en http://momentjs.com/js/tests.js?_=120203_183019:616:13
en http://momentjs.com/js/tests.js?_=120203_183019:627:25
en http://momentjs.com/js/tests.js?_=120203_183019:1008:17
en http://momentjs.com/js/tests.js?_=120203_183019:1589:17
+02: 00 ---> Algo como "+07: 30"
+0200 ---> Algo como "+0700"

También obtengo la misma prueba fallida # 28. Mi zona horaria es GMT -3.

Agente:
Mozilla / 5.0 (Windows NT 6.1; WOW64) AppleWebKit / 535.11 (KHTML, como Gecko) Chrome / 17.0.963.66 Safari / 535.11

Prueba fallida: http://pastebin.com/dsWHMF3h

.:.

Agente:
Mozilla / 5.0 (Windows NT 6.1; WOW64; rv: 10.0.2) Gecko / 20100101 Firefox / 10.0.2
o
Mozilla / 5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident / 5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4. 0C; Zune 4.7; .NET4.0E)

Prueba fallida: http://pastebin.com/6t6JP9fu

Parece que esto está sucediendo en UTC + 1, UTC + 2 y UTC-3.

Desafortunadamente, ahora hay una forma de solucionar este problema. Depende de piratear la salida Date().toString() , y si no hay información de zona horaria disponible en esa cadena, no hay forma de obtener esa información.

Voy a depreciar esta función y tal vez crear un complemento que tenga resultados más confiables (aunque quizás menos precisos). Probablemente debería ser algo como https://github.com/mde/timezone-js.

Los tokens z zz están obsoletos a partir de la versión 1.6.0. Cerraré este problema como resultado.

¿Qué pasa con node.js? ¿Son z zz confiables o no en este entorno?

Han quedado oficialmente obsoletos, por lo que no funcionarán a partir de la versión 1.6.0.

Para versiones de código anteriores a eso, imagino que los resultados también serían inconsistentes, ya que Node usa V8 y algunos de los resultados inconsistentes anteriores están en Chrome, que también usa V8.

Gracias. Entonces, para una cadena como Thu Jan 10 2013 22:54:11 GMT+0100 (CET) , lo que terminé haciendo es eliminar con una expresión regular la cadena de la zona horaria (aquí (CET) con el espacio inicial) y dejar solo la información de cambio de tiempo (aquí +0100 ). ¿Crees que es suficiente para moment.js o me arriesgo a inconsistencias?

Hmm, no estoy seguro de lo que estás intentando hacer, ¿estás intentando conseguir CET o +0100 ?

+0100 se admite a través del token ZZ (tenga en cuenta las mayúsculas) y funciona bien al analizar y formatear.

CET quedó obsoleto ya que no pudimos obtenerlo de manera confiable desde Date.toString . Sin embargo, como usamos Date.getTimezoneOffset por +0100 , el soporte es mucho más consistente.

Estoy haciendo lo que dices, usando ZZ para +0100 y eliminando CET de la cadena para analizar. Tiene sentido ?

Mis disculpas, todavía no entiendo cuál es el problema aquí. ¿Estás intentando analizar Thu Jan 10 2013 22:54:11 GMT+0100 (CET) ? Debería poder hacer lo siguiente.

moment('Thu Jan 10 2013 22:54:11 GMT+0100 (CET)', 'ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');

Esto es exactamente lo que estoy haciendo al final. Parece que estás confirmando que estoy haciendo lo correcto. Mis disculpas Si no fue claro, ¡gracias por las respuestas!

¡No hay problema!

@ hughanderson4 , el problema era que los navegadores no siempre devuelven una abreviatura de zona horaria de Date.prototype.toString . Debido a que no pudimos obtener de manera confiable la abreviatura de la zona horaria, quedó obsoleta.

Desde entonces, se ha creado moment-timezone para agregar soporte de zona horaria para moment.js. Es posible que desee examinarlo para ver si se ajusta a sus necesidades.

¿Cómo convertir un moment.utc () a la hora local y mostrar la abreviatura de la zona horaria?

Pregunta estúpida: ¿por qué una biblioteca completamente nueva? ¿No es el objetivo de Moment resolver todas las necesidades de manejo de fechas y horas? Si bien los archivos de datos agregan una cantidad de espacio no trivial (y puedo entender separarlos), la nueva biblioteca en sí es <2k, por lo que el espacio no parece ser una razón para separarla.

Parece un poco triste que alguien que simplemente quiera generar una cadena de fecha con una zona horaria tenga que descargar dos bibliotecas separadas y un archivo de datos para hacer lo que Javascript debería tener incorporado.

Además, ¿cómo uso esta nueva combinación de bibliotecas para generar una cadena de fecha simple? Antes podría haber generado:

Sun, 06 Nov 1994 08:49:37 GMT

con:

moment().format('ddd, DD MMM YYYY HH:mm:ss z');

Pero ahora estoy confundido en cuanto a cómo se supone que debo hacer eso sin la opción de formato "z". Cualquier ayuda sería apreciada.

Entonces, preguntando solo para asegurarme de que comprendo: ¿No hay reemplazo para el formato obsoleto 'z'?

Si tengo una marca de tiempo en formato ISO-8601, como:

2014-07-25T18:00:00-04:00

Y quiero mostrar esta marca de tiempo de la siguiente manera:

6:00 PM EST

¿Momento ya no admite este formato? Todos los datos de la zona horaria están incluidos en mi marca de tiempo, y solo quiero mostrarlos directamente sin transformar la zona horaria de ninguna manera.

Eso en realidad no incluye la zona horaria. Puede haber varios nombres de zonas horarias que se correspondan con el mismo desplazamiento UTC, especialmente cuando se consideran las posibilidades de variar el horario de verano. No se puede inferir de "UTC-4: 00" que la zona horaria es EST.

Para aclarar, el formateador z todavía funciona cuando se usa el momento-zona horaria con una zona específica, ya que la abreviatura se puede extraer de los datos de la zona horaria.

Solo menciono esto ahora, si usa
new Date().toTimeString()
obtienes el mismo resultado en todos los navegadores por lo que he intentado.

Esto significa que posiblemente podría usar esta cadena para extraer la zona horaria, ¿no?

Hola, veo arriba que el formato ('z') está obsoleto. también en los documentos de momento, veo que ha quedado obsoleto desde 1.6.0. Estoy usando 2.11.0 ahora, puedo usar la 'z' para mostrar la zona horaria (PST / PDT) según el desplazamiento.
¿No debería usar esta 'z' en mi código ahora? ¿Puede indicar la alternativa exacta para mostrar PST en lugar de - / + 8?

@themakshter : no, no obtiene el mismo resultado en todos los navegadores. El sistema operativo, la versión del navegador y el idioma influyen en gran medida, y no hay un requisito de coherencia en la especificación.

@ Shobana16 - Si solo hace moment().format('z') , siempre devolverá "" .

Si está utilizando la zona horaria de momento y hace algo como moment.tz('America/Los_Angeles').format('z') , obtendrá una respuesta válida.

z está bien con la zona horaria del momento. No hace nada en un momento sencillo.

Gracias por los comentarios MJ. Sí, estoy usando 'z' solo con la zona horaria del momento. Ok, cool seguirá siendo mi código con 'z'. !

Solo una nota para agregar, a partir de la zona horaria 0.5.0, puede _ adivinar_ en la zona horaria local, lo que abre la puerta a:

var abbreviation = moment.tz(moment.tz.guess()).format('z');

Esto está bien, pero tenga en cuenta que:

  1. Es solo una suposición. Puede que adivine mal.
  2. Si adivina mal, todavía existe la posibilidad de que la abreviatura sea correcta, ya que muchas zonas horarias similares usarán las mismas abreviaturas, por ejemplo, cómo Europe/Paris y Europe/Berlin usan CET y CEST .
  3. Sin embargo, no hay garantías. Si adivina mal, puede presentar una abreviatura incorrecta.

También podríamos considerar adaptar moment.js de manera que si la zona horaria de momento está disponible, podría intentar hacer esto automáticamente para volver a habilitar el formateador z . Aunque esto no está sucediendo actualmente.

var abbreviation = moment.tz(moment.tz.guess()).format('zz'); no parece funcionar (con dos z s). ¿Solo puedo recuperar "EDT" y no "Eastern Daylight Time"?

¡Gracias!

Ahhh, encontré que http://momentjs.com/timezone/docs/#/using -timezones / formatting / dice: Para proporcionar nombres de forma larga, puede anular moment.fn.zoneName y usar zz token.
[and much more...]
Gracias.

Sin embargo, una cosa es confusa. En la versión actual (o como se indica "a partir de 1.6.0 ") no hay forma de mostrar la zona horaria sin usar una zona horaria separada. Pero cuando hago moment(...).toString() , muestra, por ejemplo, GMT al final. Entonces, ¿es un error o una solución contradice otra funcionalidad?

Sin embargo, una cosa es confusa. En la versión actual (o como se indica "a partir de 1.6.0 ") no hay forma de mostrar la zona horaria sin usar una zona horaria separada. Pero cuando hago moment(...).toString() , muestra, por ejemplo, GMT al final. Entonces, ¿es un error o una solución contradice otra funcionalidad?

Creo que el problema es la fiabilidad. Moment no puede extraer de manera confiable la zona horaria correcta del objeto de fecha local, por lo que ya no admite z/zz en su formato.

Discutido arriba:
https://github.com/moment/moment/issues/162#issuecomment -4060027

Esto es lo que nos funcionó para obtener el texto "GMT" ya que z ha quedado obsoleto

const dateGenerated = moment("2020-05-20 08:15:25");
const localDateGenerated = dateGenerated.local().format('DD MMM YYYY hh:mm A') + ' ' + String(dateGenerated.local()._d).split(' ')[5];

Generará 20 May 2020 08:15 AM GMT+0300"

¿Fue útil esta página
0 / 5 - 0 calificaciones