Estoy tratando de pasar ambas cadenas de fechas a new Date(t)
.
Espero que ambas cadenas representen la misma hora, después de todo, si omito la hora, ¿no debería ser la medianoche de ese día?
Pero mientras,
new Date("2016-02-16 00:00")
devuelve 2016-02-16, medianoche, hora local como se esperaba,
new Date("2016-02-16")
devuelve 2016-02-16, medianoche UTC, lo cual es incorrecto, o al menos no es lo que esperaba dado lo que analiza la otra cadena.
Lo entendería si ambos tuvieran el mismo comportamiento, ya sea para devolver la hora como hora local o como UTC, pero parece muy inconsistente por qué devuelven cosas diferentes como esta.
Como solución temporal, cada vez que encuentro una fecha que no tiene una marca de tiempo correspondiente, puedo agregar "00:00" para obtener un comportamiento consistente, pero parece que esto es bastante frágil.
Obtengo este valor de un elemento INPUT, de tipo 'datetime-local', por lo que parece especialmente incoherente que tenga que solucionar un valor devuelto por un elemento de página.
¿Estoy haciendo algo mal o debería hacer algo diferente?
fuente
2016-02-16 00:00
- esta no parece la hora válida en absoluto. ecma-international.org/ecma-262/6.0/… , pero incluso después de ponerloT
allí, de hecho se comporta de manera diferenteRespuestas:
Es lo que dice la especificación ES5.1 :
También dice:
Dado que el formato requiere un
T
separador entre fecha y hora, las horas válidas van a UTC:... mientras que en node.js, una hora no válida (sin el separador T) parece ir a la hora local específica de la implementación:
Tenga en cuenta que ES6 cambió esto, en la misma parte de la documentación a la que cambia:
La alegría de romper los cambios .
Editar
Según TC39 , la especificación debe interpretarse como cadenas de fecha y hora sin una zona horaria (p. Ej., "2016-02-16T00: 00: 00") se tratan como locales (según ISO 8601), pero solo cadenas de fecha (p. Ej. "2016-02-16") como UTC (que es incompatible con ISO 8601).
fuente
Según las especificaciones :
Y los formatos de cadena de fecha y hora aceptan
2016-02-16
como una fecha válidaAsí se
2016-02-16
traduce en2016-02-16T00:00:00.000Z
.La otra fecha
2016-02-16 00:00
no se ajusta al formato y, por lo tanto, su análisis es específico de la implementación. Aparentemente, estas fechas se tratan como si tuvieran una zona horaria local y la fecha de su ejemplo devolverá diferentes valores según la zona horaria:Resumen:
NaN
lugar de intentar analizar las fechas no conformes. Simplemente pruebe su código en Internet Explorer 11;)fuente
Quizás se encuentre con diferencias entre las implementaciones de ES5, ES6 y el resultado esperado. Por Date.parse en MDN, "especialmente en diferentes implementaciones de ECMAScript donde cadenas como" 2015-10-12 12:00:00 "se pueden analizar como NaN, UTC o zona horaria local" es significativo.
Pruebas adicionales en Firefox 44 e IE 11 revelaron que ambos devuelven un objeto de fecha
new Date("2016-02-16 00:00")
, cuyo objeto devuelve NaN cuando se intenta obtener un valor de componente de fecha, y cuyo valor toString es "Fecha no válida" (no "NaN"). Por lo tanto, agregar "00:00 para obtener un comportamiento consistente" puede romper fácilmente en diferentes navegadores.Como se señaló en otras respuestas,
new Date("2016-02-16")
utiliza un desplazamiento de zona horaria de cero de forma predeterminada, lo que produce la medianoche UTC en lugar de local.fuente
Por
DateParser::Parse()
código fuente V8 para Chrome.fuente
Agrega el desplazamiento de la zona horaria al
00:00
new Date("2016-02-16")
salidasTue Feb 16 2016 05:30:00 GMT+0530 (India Standard Time)
Mi zona horaria es IST con un valor de compensación (en minutos)
+330
, por lo que agregó 330 minutos a las 00:00.Según ecma-262, sección 20.3.3.2 Date.parse (cadena)
Cuando establezca explícitamente las unidades de tiempo
new Date("2016-02-16 00:00")
, usará establecer eso comohours
yminutes
,De lo contrario, como se indica aquí en 2 0.3.1.16
fuente
section 20.3.3.2
The String may be interpreted as a local time, a UTC time, or a time in some other time zone, depending on the contents of the String.
¿Dónde está afirmando que debe ser el mismo?