¿Por qué js resta un día de un objeto Date con un formato determinado?

Obtengo las fechas de la base de datos en este formato:

aaaa-mm-dd

Cuando creo un objeto Fecha javascript utilizando esta cadena, se construye un día antes de la fecha.

Puedes probar esto en tu consola:

var d = new Date("2015-02-01"); d 

¡Usted recibirá el 31 de enero! He probado muchas teorías, pero ninguna responde la pregunta.

  • El día no está basado en cero, de lo contrario daría febrero 00, no enero 31
  • No está realizando una ecuación matemática, restando el día del mes y / o año
    • Fecha (2015-02-01) = mié 31 de diciembre de 1969
    • Fecha (“2015-01”) = mié 31 de diciembre de 2014
  • No es confuso el día del mes.
    • Fecha (“2015-08-02”) = sáb 01 ago 2015
    • Si esto fuera cierto, la fecha sería el 8 de febrero de 2015.
  • Si crea una fecha con un formato diferente, funciona bien
    • Fecha (“01/02/2015”) = 1 de febrero de 2015

Mi conclusión es que js hace esto intencionalmente. He intentado investigar ‘por qué’ pero no puedo encontrar una explicación. ¿Por qué js construye las fechas de esta manera, pero solo con este formato? ¿Hay alguna forma de evitarlo o tengo que crear la Fecha y luego configurarlo para el día siguiente?

PD: “Cómo cambiar el formato de la fecha de la base de datos” no es lo que estoy preguntando, y es por eso que no estoy poniendo ninguna información de la base de datos aquí.

Algunos navegadores analizan una cadena de fecha parcial como UTC y otros como una hora local,

así que cuando lo lea, la hora localizada puede diferir de un navegador a otro

por la zona horaria de desplazamiento.

Puede forzar que la Fecha sea UTC y agregar la compensación local si

Quiere que el tiempo sea garantizado localmente:

 1. set UTC time: var D= new Date("2015-02-01"+'T00:00:00Z'); 2. adjust for local: D.setMinutes(D.getMinutes()+D.getTimezoneOffset()); 

valor de D: (fecha local) dom. 01 de febrero de 2015 00:00:00 GMT-0500 (hora estándar del este)

La compensación será cualquier hora local.

 Some differences between browsers when time zone is not specified in a parsed string: (tested on Eastern Standard Time location) (new Date("2015-02-01T00:00:00")).toUTCString(); Firefox 35: Sun, 01 Feb 2015 05:00:00 GMT Chrome 40: Sun, 01 Feb 2015 00:00:00 GMT Opera 27: Sun, 01 Feb 2015 00:00:00 GMT IE 11: Sun, 01 Feb 2015 05:00:00 GMT IE and Firefox set the Date as if it was local, Chrome and Opera as if it was UTC. 

En javascript, los objetos de fecha se representan internamente como el número de milisegundos desde el 1 de enero de 1970 a las 00:00:00 UTC. Entonces, en lugar de pensar que es una “fecha” en el sentido normal, intente pensar en un objeto Date como un “punto en el tiempo” representado por un número entero (sin zona horaria).

Cuando construyes tu objeto Date usando una cadena, en realidad solo estás llamando a la función de análisis . La mayoría de los formatos de fecha y hora ( incluyendo ISO 8601 ) le permiten reducir la precisión de una cadena de fecha.

Para una precisión reducida, cualquier número de valores puede eliminarse de cualquiera de las representaciones de fecha y hora, pero en el orden de menor a mayor.

Ej. 2015-02-01 representaría el día 1 de febrero de 2015 .

Esto causa un dilema para javascript porque un objeto Date siempre es preciso en milisegundos. Javascript no puede almacenar una fecha de precisión reducida, ya que es solo un número entero de milisegundos desde el 1 de enero de 1970. Por lo tanto, lo mejor que puede hacer es asumir una hora de medianoche (00:00:00) si no se especifica, y una zona horaria de UTC si no se especifica.

Todas las implementaciones válidas de javascript deberían dar el mismo resultado para esto :

 var d = new Date("2015-02-01"); alert(d.getTime()); 1422748800000 

El problema de salida por 1 día se produce al enviar la fecha a un depurador (a menudo poco claro) o al usar los métodos de obtención porque se usa la zona horaria local. En un navegador, esa será la zona horaria de su sistema operativo. Cualquier persona “al oeste” de Greenwich Mean Time puede ver este problema porque tiene un desplazamiento UTC negativo. Tenga en cuenta que también hay funciones UTC equivalentes que utilizan la zona horaria UTC, si realmente está interesado en representar una fecha en lugar de un punto en el tiempo.