new Date() funciona de manera diferente en Chrome y Firefox
Quiero convertir una cadena de fecha a Date
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?
El formato correcto para UTC sería 2013-02-27T17:00:00Z
(Z es para hora zulú). Agregue Z
si no está presente para obtener la cadena de fecha y hora UTC correcta.
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 la implementación o formatos de fecha específicos de la implementación.
Para que el Date
constructor no (tal vez) use la zona horaria local, use una cadena de fecha y hora con información de zona horaria, por ejemplo "2013-02-27T17:00:00Z"
. Sin embargo, es difícil encontrar un formato que sea confiable analizado 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 introducirlas en Date.UTC
.