new Date() funciona de manera diferente en Chrome y Firefox

2 minutos de lectura

avatar de usuario
charlar

Quiero convertir cadena de fecha a Date por javascript, use este código:

var date = new Date('2013-02-27T17:00:00');
alert(date);

'2013-02-27T17:00:00' es la hora UTC en el objeto JSON del servidor.

Pero el resultado del código anterior es diferente entre Firefox y Chrome:

Firefox devuelve:

Wed Feb 27 2013 17:00:00 GMT+0700 (SE Asia Standard Time)

Chrome devuelve:

Thu Feb 28 2013 00:00:00 GMT+0700 (SE Asia Standard Time) 

Es diferente 1 día, el resultado correcto que esperaría es el resultado de Chrome.

Código de demostración: http://jsfiddle.net/xHtqa/2/

¿Cómo puedo solucionar este problema para obtener el mismo resultado de ambos?

  • ¿Está en la misma computadora?

    – Aarón Digulla

    27 de febrero de 2013 a las 10:39

  • @Sandeep, el punto principal es que Chrome agrega un desplazamiento de zona horaria mientras que Firefox no lo hace

    – configuración regional predeterminada

    27 de febrero de 2013 a las 10:43

  • @CuongLe ¿Has visto esta pregunta: stackoverflow.com/questions/9062863/…

    – configuración regional predeterminada

    27 de febrero de 2013 a las 10:44

  • Es Date {Wed Feb 27 2013 17:00:00 GMT+0000 (GMT)} para mí en ambos (Linux).

    – maravilloso

    27 de febrero de 2013 a las 10:45


  • El rincón del quisquilloso: «Hora UTC en formato JSON» – ¿Formato JSON? Precisamente, una queja común sobre JSON es que no define ningún formato de fecha en absoluto.

    –Álvaro González

    27 de febrero de 2013 a las 10:51

El formato correcto para UTC sería 2013-02-27T17:00:00Z (Z es para Zulu Time). Adjuntar Z si no está presente para obtener la cadena de fecha y hora UTC correcta.

  • Gracias. Esto funciona. ¡Pero hay un registro que dice que quedará obsoleto en el futuro! ¿Alguna idea por favor?

    – Débora

    23 de marzo de 2016 a las 17:21

  • muchas gracias, he estado sentado con este problema durante dos días, pero esta publicación resolvió todo.

    – Jorge Piyal

    25 de septiembre de 2017 a las 13:11

avatar de usuario
Bergi

Sí, desafortunadamente los algoritmos de análisis de fechas dependen de la implementación. Desde el especificación de Date.parse (que es usado por new Date):

La cadena se puede interpretar como una hora local, una hora UTC o una hora en alguna otra zona horaria, según el contenido de la cadena. La función primero intenta analizar el formato de la cadena de acuerdo con las reglas indicadas en Formato de cadena de fecha y hora (15.9.1.15). Si la cadena no se ajusta a ese formato, la función puede recurrir a cualquier heurística específica de la implementación o formatos de fecha específicos de la implementación.

para hacer el Date constructor no (tal vez) use la zona horaria local, use una cadena de fecha y hora con información de la zona horaria, por ejemplo "2013-02-27T17:00:00Z". Sin embargo, es difícil encontrar un formato que todos los navegadores analicen de manera confiable: IE<8 no reconoce el formato ISO (consulte JavaScript: qué navegadores admiten el análisis de la cadena de fecha ISO-8601 con Date.parse). Mejor, use una marca de tiempo de Unix, es decir, milisegundos desde época unixo use una expresión regular para descomponer la cadena en sus partes y luego introducirlas en Date.UTC.

  • Pero la especificación (15.9.1.15) en realidad dice: “El valor de un desplazamiento de zona horaria ausente es “Z””, por lo que NO debería depender de la implementación.

    – sinelaw

    12 de diciembre de 2013 a las 23:25


  • Bien, corrección. Parece un error en la especificación ES5.1 – la intención era hacer coincidir ISO-8601 donde falta Z significa hora local (por lo que Chrome coincide con ES5.1, Firefox e IE coinciden con ISO-8601)

    – sinelaw

    12 de diciembre de 2013 a las 23:34

  • @sinelaw: Gracias por seguir investigando ese punto. Sin embargo, independientemente de lo que indique la especificación, [old] los navegadores todavía lo hacen de manera diferente 🙂

    – Bergi

    12 de diciembre de 2013 a las 23:51

  • Extrañamente, el uso de Date.Parse vs. new Date solucionó el problema que tenía cuando Chrome convertía la fecha a la zona horaria local en lugar de tratarla como si ya estuviera en la zona horaria local.

    – Rey de los hipócritas

    21 de julio de 2014 a las 17:20

  • @KingOfHypocrites—eso es un poco raro como llamar al constructor Date con una cuerda se supone que es lo mismo que usar Fecha.parse.

    – RobG

    25 de enero de 2015 a las 6:18

Encontré una cosa aquí. Parece que la Consola del Inspector de Firefox nativo podría tener un error: si ejecuto “nueva fecha ()” en el Inspector nativo, muestra una fecha con zona horaria incorrecta, configuración regional GMT, pero ejecutando el mismo comando en la Consola de extensión de Firebug, la fecha mostrado usa mi zona horaria correcta (GMT-3:00).

avatar de usuario
Tormenta MJ

Noté que FireFox no devolvía el mismo resultado que Chrome. Parece que el formato que usa en kendo.toString para la fecha hace la diferencia.

El último resultado de la consola es lo que necesitaba:

ingrese la descripción de la imagen aquí

avatar de usuario
MSIislam

Intenta usar moment.js. Va muy bien y de forma similar con todos los navegadores. viene con muchas opciones de formato. use moment(‘date’).format(“”) en lugar de New Date(‘date’)

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad