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

94

Quiero convertir la cadena de fecha a Datejavascript, 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 regresa:

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

Chrome regresa:

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?

cuongle
fuente
2
¿Eso está en la misma computadora?
Aaron Digulla
4
@Sandeep, el punto principal es que Chrome agrega un desplazamiento de zona horaria mientras que Firefox no lo hace
configuración regional predeterminada
3
@CuongLe ¿Has visto esta pregunta: stackoverflow.com/questions/9062863/…
configuración regional predeterminada
1
Es Date {Wed Feb 27 2013 17:00:00 GMT+0000 (GMT)}para mí en ambos (Linux).
marekful
1
El rincón de Nitpicker: «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

Respuestas:

66

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

Petr Abdulin
fuente
2
Gracias. Esto funciona. Pero hay un registro que dice, ¡¡¡será obsoleto en el futuro !!!. ¿Alguna idea por favor?
Débora
1
muchas gracias, he estado sentado con este problema durante dos días, pero esta publicación resolvió todo.
Piyal George
30

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

La Cadena puede interpretarse 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 implementación o formato de fecha específico de implementación.

Para hacer que el Dateconstructor no (quizás) 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 sea analizado de manera confiable por todos los navegadores: 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 la época de Unix , o use una expresión regular para dividir la cadena en sus partes y luego alimentarlas Date.UTC.

Bergi
fuente
2
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
OK, corrección. Parece un error en la especificación ES5.1 : la intención era coincidir con ISO-8601 donde falta Z significa hora local (por lo que Chrome coincide con ES5.1, Firefox e IE coinciden con ISO-8601)
sinelaw
@sinelaw: Gracias por seguir investigando ese punto. Sin embargo, independientemente de lo que indique la especificación, los navegadores [antiguos] todavía lo hacen de manera diferente :-)
Bergi
2
Curiosamente, el uso de Date.Parse frente a new Date solucionó el problema que tenía en el que Chrome convertía la fecha a la zona horaria local en lugar de tratarla como si ya estuviera en la zona horaria local.
KingOfHypocrites
1
@ KingOfHypocrites: eso es un poco extraño, ya que se supone que llamar al constructor Date con una cadena es lo mismo que usar Date.parse .
RobG
4

Encontré una cosa aquí. Parece que la Consola del Inspector de Firefox nativa podría tener un error: si ejecuto "new Date ()" 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 que se muestra utiliza mi zona horaria correcta (GMT-3: 00).

Sergio Abreu
fuente
-2

Intente 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')

MSIslam
fuente
-2

Noté que FireFox no estaba devolviendo el mismo resultado que Chrome. Parece que el formato que usa en kendo.toString para la fecha marca la diferencia.

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

ingrese la descripción de la imagen aquí

MJ Storm
fuente