sumar - Objeto de fecha de Javascript siempre un día de descanso?
sumar meses a una fecha javascript (14)
Aunque en el caso del OP la zona horaria es EDT, no hay garantía de que el usuario que ejecute su script esté en la zona horaria EDT, por lo que la codificación no necesariamente funcionará. La solución que encontré divide la cadena de fecha y usa los valores separados en el constructor de Fecha.
var dateString = "2011-09-24";
var dateParts = dateString.split("-");
var date = new Date(dateParts[0], dateParts[1] - 1, dateParts[2]);
Tenga en cuenta que tiene que dar cuenta de otra parte de la rareza JS: el mes está basado en cero.
En mi aplicación java-script tengo la fecha almacenada en un formato como el siguiente:
2011-09-24
Ahora, cuando intento utilizar el valor anterior para crear un nuevo objeto Date (para poder recuperar la fecha en un formato diferente), la fecha siempre vuelve un día libre. Vea abajo:
var doo = new Date("2011-09-24");
console.log(doo);
Fri Sep 23 2011 20:00:00 GMT-0400 (Eastern Daylight Time)
Cualquier ayuda en esto es apreciada.
Gracias
Creo que tiene que ver con el ajuste de la zona horaria. La fecha que ha creado está en GMT y la hora predeterminada es medianoche, pero su zona horaria es EDT, por lo que resta 4 horas. Intenta esto para verificar:
var doo = new Date("2011-09-25 EDT");
Esto a través de mí para un bucle, +1 en la respuesta de zzzBov. Aquí hay una conversión completa de una fecha que funcionó para mí usando los métodos UTC:
//myMeeting.MeetingDate = ''2015-01-30T00:00:00''
var myDate = new Date(myMeeting.MeetingDate);
//convert to JavaScript date format
//returns date of ''Thu Jan 29 2015 19:00:00 GMT-0500 (Eastern Standard Time)'' <-- One Day Off!
myDate = new Date(myDate.getUTCFullYear(), myDate.getUTCMonth(), myDate.getUTCDate());
//returns date of ''Fri Jan 30 2015 00:00:00 GMT-0500 (Eastern Standard Time)'' <-- Correct Date!
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 ser UN DÍA APAGADO o no 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é pasa si tenemos 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 a barra diagonal como antes; ¿lo que pasa?
new Date("2011/09/24T00:00:00");
// => Invalid Date
Normalmente tengo que gestionar 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 para el constructor de fechas, 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.
Obtenga 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)
Obtenga 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 número, argumentos de cadena. Tenga en cuenta que el mes es marzo porque cero meses base nuevamente.
new Date(2011, "02");
=> // Tue Mar 01 2011 00:00:00 GMT-0700 (MST)
Si hacemos lo mismo pero con un día de 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 de 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, puedes continuar retrocediendo otro día
new Date(2011, "02", -1);
=> // Sun Feb 27 2011 00:00:00 GMT-0700 (MST)
La mejor manera de manejar esto sin usar más métodos de conversión,
var mydate=''2016,3,3'';
var utcDate = Date.parse(mydate);
console.log(" You''re getting back are 20. 20h + 4h = 24h :: "+utcDate);
Ahora solo agregue GMT en su fecha o puede agregarlo.
var mydateNew=''2016,3,3''+ ''GMT'';
var utcDateNew = Date.parse(mydateNew);
console.log("the right time that you want:"+utcDateNew)
Lo siguiente funcionó para mí:
var doo = new Date("2011-09-24").format("m/d/yyyy");
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 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 ) );
Probablemente esta no sea una buena respuesta, pero solo quiero compartir mi experiencia con este tema.
Mi aplicación utiliza globalmente la fecha utc con el formato ''YYYY-MM-DD'', mientras que el complemento datepicker que uso solo acepta la fecha js, es difícil para mí considerar utc y js. Entonces, cuando quiero pasar una fecha formateada ''AAAA-MM-DD'' a mi selector de fecha, primero lo convierto al formato ''MM / DD / YYYY'' usando moment.js o lo que quiera, y la fecha que aparece en datepicker es ahora correcto. Para tu ejemplo
var d = new Date(''2011-09-24''); // d will be ''Fri Sep 23 2011 20:00:00 GMT-0400 (EDT)'' for my lacale
var d1 = new Date(''09/24/2011''); // d1 will be ''Sat Sep 24 2011 00:00:00 GMT-0400 (EDT)'' for my lacale
Aparentemente d1 es lo que quiero. Espero que esto sea útil para algunas personas.
Si desea obtener la hora 0 de alguna fecha en la zona horaria local, pase las partes de fecha individuales al constructor de Date
.
new Date(2011,08,24); // month value is 0 based, others are 1 based.
Significa 2011-09-24 00:00:00 GMT
, y dado que estás en GMT -4
, serán las 20:00
del día anterior.
Personalmente, recibo 2011-09-24 02:00:00
, porque estoy viviendo en GMT +2
.
Solo quiero añadir que al parecer, al agregar un espacio al final de la cadena, se usará UTC para la creación.
new Date("2016-07-06")
> Tue Jul 05 2016 17:00:00 GMT-0700 (Pacific Daylight Time)
new Date("2016-07-06 ")
> Wed Jul 06 2016 00:00:00 GMT-0700 (Pacific Daylight Time)
Su problema es específicamente con la zona horaria. Tenga en cuenta la parte GMT-0400
, es decir que está a 4 horas de GMT. Si agrega 4 horas a la fecha / hora mostrada, obtendrá exactamente la medianoche del 24/09/2011. Use el método toUTCString()
para obtener la cadena GMT:
var doo = new Date("2011-09-24");
console.log(doo.toUTCString());
Tenga en cuenta que Eastern Daylight Time es de -4 hours
y que las horas de la fecha de regreso son 20
.
20h + 4h = 24h
que es la medianoche del 2011-09-24.
Estás obteniendo la fecha correcta, nunca especificaste la zona horaria correcta.
Si necesita acceder a los valores de fecha, puede usar getUTCDate()
o cualquiera de las otras getUTC*()
:
var d,
days;
d = new Date(''2011-09-24'');
days = [''Sun'', ''Mon'', ''Tues'', ''Wed'', ''Thurs'', ''Fri'', ''Sat''];
console.log(days[d.getUTCDay()]);
no importa, no notó el GMT -0400, lo que hace que la fecha sea ayer
Podría intentar establecer un "tiempo" predeterminado para que sea 12:00:00