¿El objeto de fecha de Javascript siempre tiene un día libre?

Resuelto levi asked hace 13 años • 33 respuestas

En mi aplicación Java Script tengo la fecha almacenada en un formato como este:

2011-09-24

Ahora, cuando intento usar el valor anterior para crear un nuevo objeto Fecha (para poder recuperar la fecha en un formato diferente), la fecha siempre vuelve con un día libre. Vea abajo:

var date = new Date("2011-09-24");
console.log(date);

registros:

Fri Sep 23 2011 20:00:00 GMT-0400 (Eastern Daylight Time)
levi avatar Sep 26 '11 21:09 levi
Aceptado

Hay varias cosas locas que suceden con un objeto JS DATE que convierte cadenas, por ejemplo considere la siguiente fecha que proporcionó

Nota: Los siguientes ejemplos pueden tener o no UN DÍA LIBRE dependiendo de SU zona horaria y hora actual.

new Date("2011-09-24"); // Year-Month-Day
// => Fri Sep 23 2011 17:00:00 GMT-0700 (MST) - ONE DAY OFF.

Sin embargo, si reorganizamos el formato de cadena a Mes-Día-Año ...

new Date("09-24-2011");
// => Sat Sep 24 2011 00:00:00 GMT-0700 (MST) - CORRECT DATE.

Otro extraño

new Date("2011-09-24");
// => Fri Sep 23 2011 17:00:00 GMT-0700 (MST) - ONE DAY OFF AS BEFORE.

new Date("2011/09/24"); // change from "-" to "/".
// => Sat Sep 24 2011 00:00:00 GMT-0700 (MST) - CORRECT DATE.

Podríamos cambiar fácilmente los guiones en su fecha "2011-09-24" al hacer una nueva fecha

new Date("2011-09-24".replace(/-/g, '\/')); // => "2011/09/24".
// => Sat Sep 24 2011 00:00:00 GMT-0700 (MST) - CORRECT DATE.

¿Qué pasaría si tuviéramos una cadena de fecha como "2011-09-24T00:00:00"?

new Date("2011-09-24T00:00:00");
// => Fri Sep 23 2011 17:00:00 GMT-0700 (MST) - ONE DAY OFF.

Ahora cambie el guión por una barra diagonal como antes; ¿lo que sucede?

new Date("2011/09/24T00:00:00");
// => Invalid Date.

Normalmente tengo que administrar el formato de fecha 2011-09-24T00:00:00 así que esto es lo que hago.

new Date("2011-09-24T00:00:00".replace(/-/g, '\/').replace(/T.+/, ''));
// => Sat Sep 24 2011 00:00:00 GMT-0700 (MST) - CORRECT DATE.

ACTUALIZAR

Si proporciona argumentos separados al constructor Date, puede obtener otros resultados útiles como se describe a continuación

Nota: los argumentos pueden ser de tipo Número o Cadena. Mostraré ejemplos con valores mixtos.

Obtener el primer mes y día de un año determinado

new Date(2011, 0); // Normal behavior as months in this case are zero based.
// => Sat Jan 01 2011 00:00:00 GMT-0700 (MST)

Obtener el último mes y día de un año.

new Date((2011 + 1), 0, 0); // The second zero roles back one day into the previous month's last day.
// => Sat Dec 31 2011 00:00:00 GMT-0700 (MST)

Ejemplo de argumentos numéricos y de cadena. Tenga en cuenta que el mes es marzo porque nuevamente se basan en cero meses.

new Date(2011, "02"); 
// => Tue Mar 01 2011 00:00:00 GMT-0700 (MST)

Si hacemos lo mismo pero con día cero, obtenemos algo diferente.

new Date(2011, "02", 0); // Again the zero roles back from March to the last day of February.
// => Mon Feb 28 2011 00:00:00 GMT-0700 (MST)

Al agregar un día cero a cualquier argumento de año y mes, se obtendrá el último día del mes anterior. Si continúas con números negativos podrás seguir retrocediendo un día más.

new Date(2011, "02", -1);
// => Sun Feb 27 2011 00:00:00 GMT-0700 (MST)
SoEzPz avatar Jul 30 '2015 19:07 SoEzPz

Tenga en cuenta que el horario de verano del este es -4 hoursy que las horas de la fecha a la que regresa son 20.

20h + 4h = 24h

que es la medianoche del 24/09/2011. La fecha se analizó en UTC (GMT) porque proporcionó una cadena de solo fecha sin ningún indicador de zona horaria. Si hubiera proporcionado una cadena de fecha/hora sin un indicador ( new Date("2011-09-24T00:00:00")), se habría analizado en su zona horaria local. (Históricamente ha habido inconsistencias allí, sobre todo porque la especificación cambió más de una vez, pero los navegadores modernos deberían funcionar bien; o siempre puedes incluir un indicador de zona horaria).

Estás obteniendo la fecha correcta, pero nunca especificaste la zona horaria correcta.

Si necesita acceder a los valores de fecha, puede utilizar getUTCDate()cualquiera de las otras getUTC*()funciones :

var d,
  days;
d = new Date('2011-09-24');
days = ['Sun', 'Mon', 'Tues', 'Wed', 'Thurs', 'Fri', 'Sat'];
console.log(days[d.getUTCDay()]);
Expandir fragmento

zzzzBov avatar Sep 26 '2011 14:09 zzzzBov

Para normalizar la fecha y eliminar el desplazamiento no deseado (probado aquí: https://jsfiddle.net/7xp1xL5m/ ):

var doo = new Date("2011-09-24");
console.log(  new Date( doo.getTime() + Math.abs(doo.getTimezoneOffset()*60000) )  );
// Output: Sat Sep 24 2011 00:00:00 GMT-0400 (Eastern Daylight Time)

Esto también logra lo mismo y le damos crédito a @tpartee (probado aquí: https://jsfiddle.net/7xp1xL5m/1/ ):

var doo = new Date("2011-09-24");
console.log( new Date( doo.getTime() - doo.getTimezoneOffset() * -60000 )  );
AaronLS avatar Jan 28 '2013 19:01 AaronLS