¿El objeto de fecha de Javascript siempre tiene un día libre?
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)
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)
Tenga en cuenta que el horario de verano del este es -4 hours
y 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()]);
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 ) );