Calcule la fecha de ayer en JavaScript


279

¿Cómo puedo calcular ayer como fecha en JavaScript?

Respuestas:


458
var date = new Date();

date ; //# => Fri Apr 01 2011 11:14:50 GMT+0200 (CEST)

date.setDate(date.getDate() - 1);

date ; //# => Thu Mar 31 2011 11:14:50 GMT+0200 (CEST)

12
Agradable. A primera vista, puede parecer que esto fallará ya que getDatedevuelve el día del mes (por ejemplo: 1 - 31), pero en realidad setDate(0)establece la fecha para el último día del mes anterior. ¿Funciona esto en todos los navegadores?
Drew Noakes

1
No se pudo verificar "todos" los navegadores, pero funcionó en todos los que probé camo.githubusercontent.com/…
James Kyburz

1
@ Zargold No entiendo lo que quieres decir. nodo --version v9.4.0 nodo const date = new Date () undefined> date.toISOString () '2018-02-10T16: 26: 30.821Z'> date.setDate (date.getDate () - 1) 1518193590821> date .toISOString () '2018-02-09T16: 26: 30.821Z'
James Kyburz

Hmm, sí, solo lo probé directamente y tienes razón, no estoy seguro de cómo mi caso de uso era diferente y desde entonces lo he refaccionado por completo. Entonces no podré ver.
Zargold

91

No muy eficiente, pero como línea:

var yesterday = new Date(new Date().setDate(new Date().getDate()-1));

Lo anterior crea tres Dateobjetos que son innecesariamente derrochadores. Esto se puede reducir a una sola instanciación con:

var yesterday = (function(){this.setDate(this.getDate()-1); return this})
                  .call(new Date)

O, si lo prefieres:

var yesterday = (function(d){ d.setDate(d.getDate()-1); return d})(new Date)

O, si prefiere ES6 con función de flecha:

let yesterday = ( d => new Date(d.setDate(d.getDate()-1)) )(new Date);

66
Prefiero evitar jugar con el alcance:var yesterday = (function(d){ d.setDate(d.getDate()-1); return d})(new Date)
Roy Tinker

44
Si necesita una sola línea, use algo como nueva Fecha (Date.now () - 24 * 60 * 60 * 1000); Esto tiene la ventaja de crear solo un objeto Date. Pero, sinceramente, quien esté manteniendo este código estará mucho más feliz de ver la versión clara de 2 líneas de lo que lo harían con funciones (o milisegundos, de hecho).
Rob Whelan

66

Prueba esto

var d = new Date();
d.setDate(d.getDate() - 1);

1
Siguiente comando d.setHours (19,59); Para configurar la hora a las 7:59 p.m.
James Jenkins

60

Sorprendentemente, no hay un punto de respuesta para la solución de navegador cruzado más fácil

Para encontrar exactamente la misma hora de ayer:

var yesterday = new Date(Date.now() - 86400000); // that is: 24 * 60 * 60 * 1000

Es decir, si desea liberarse de la dependencia, de lo contrario, le recomendaría usar http://momentjs.com


77
¿Cómo funciona esto cuando cambia el horario de verano? ¿No lo golpearía adelante / atrás una hora?
Adam Tegen

19

Para generalizar la pregunta y hacer otros cálculos de diferencias, use:

var yesterday = new Date((new Date()).valueOf() - 1000*60*60*24);

esto crea un nuevo objeto de fecha basado en el valor de "ahora" como un entero que representa la época de Unix en milisegundos restando un día.

Hace dos días:

var twoDaysAgo = new Date((new Date()).valueOf() - 1000*60*60*24*2);

Hace una hora:

var oneHourAgo = new Date((new Date()).valueOf() - 1000*60*60);

Este parece ser el método más seguro ya que estamos operando en unix epoch expresado en términos de milisegundos. Entonces la aritmética es más segura que hacer algo como getDate () - 1. No he intentado getDate () - 1, pero según la documentación de getDate (), devolverá 1 si la fecha de hoy es la primera de cualquier mes. Y 1-1 = 0 no es una fecha válida. No estoy seguro de cómo funcionará setDate (0).
Kapil Pendse

1
Este fue mi enfoque, aunque también puede simplificarlo un poco: pruebe algo como la nueva Fecha (Date.now () - 24 * 60 * 60 * 1000);
Rob Whelan

setDate (0), por cierto, estaría bien, cambiaría al último día del mes anterior. Pero me parece más ordenado (y más intuitivo) dejar la representación en milisegundos aquí, para mí, el único inconveniente es que "número de milis en un día" no es tan obvio, por lo que podría ser fácil escribir mal ese cálculo.
Rob Whelan

Trabajar con tiempo unix parece ser la opción más confiable. Esto debería ser calificado más alto.
Paul

Sí, me gusta este enfoque lo mejor. Hay menos ambigüedad. Terminé yendo con new Date(Date.parse(new Date()) - 86400000). Aunque me gusta Date.now (), tal vez intente eso en su lugar. Ahorrará una fecha extra.
coblr

9

Utilizo moment library, es muy flexible y fácil de usar.

En tu caso:

let yesterday = moment().subtract(1, 'day').toDate();

2
será mejor que uses en subtractlugar deadd
Thomas Ayoub

¡Funciona bien también! Buen trabajo para ng FullCalendar y su rango válido
XenoX


7
//Create a date object using the current time
var now = new Date();

//Subtract one day from it
now.setDate(now.getDate()-1);

6

var today = new Date();
var yesterday1 = new Date(new Date().setDate(new Date().getDate() - 1));
var yesterday2 = new Date(Date.now() - 86400000);
var yesterday3 = new Date(Date.now() - 1000*60*60*24);
var yesterday4 = new Date((new Date()).valueOf() - 1000*60*60*24);
console.log("Today: "+today);
console.log("Yesterday: "+yesterday1);
console.log("Yesterday: "+yesterday2);
console.log("Yesterday: "+yesterday3);
console.log("Yesterday: "+yesterday4);


5

Esto producirá ayer a las 00:00 con minutos de precisión

var d = new Date();
d.setDate(d.getDate() - 1);
d.setTime(d.getTime()-d.getHours()*3600*1000-d.getMinutes()*60*1000);

2
d.setHours(0,0,0,0);

hará el truco


1
Lo hará? Pensé que esto solo establecía tus horas, minutos y segundos en 0, pero en realidad no cambia la fecha.
Jesper Bylund

Tuve que usar números negativos para llegar a ayer: d.setHours(-1,0,0,0). Esto devolverá la fecha de ayer, pero puede que no sea la hora que desee (23:00:00)
cs_pupil

1

Pruébalo, funciona para mí:

var today = new Date();
var yesterday = new Date(today.setDate(today.getDate() - 1)); `

Esto me devolvió un objeto de fecha para ayer


1
Como está usando today.setDate, hoy también cambiará a ayer. Es mejor crear una variable de ayer y luego configurarla. var yesterday = new Date(); yesterday.setDate(today.GetDate() - 1)para que pueda usar hoy y ayer
PersyJack

1

Aquí hay una línea que se usa para obtener la fecha de ayer en formato AAAA-MM-DD en el texto y manejar el desplazamiento de la zona horaria.

new Date(Date.now() - 1 * 86400000 - new Date().getTimezoneOffset() * 60000).toISOString().split('T')[0]

Obviamente se puede cambiar a la fecha de regreso, x días atrás en el tiempo. Para incluir el tiempo, etc.

console.log(Date())
console.log(new Date(Date.now() - 1 * 86400000 - new Date().getTimezoneOffset() * 60000).toISOString().split('T')[0]); // "2019-11-11"
console.log(new Date(Date.now() - 1 * 86400000 - new Date().getTimezoneOffset() * 60000).toISOString().split('.')[0].replace('T',' ')); // "2019-11-11 11:11:11"

// that is: [dates] * 24 * 60 * 60 * 1000 - offsetinmin * 60 * 1000    // this is: [dates] * 24 * 60 * 60 * 1000 - offsetinmin * 60 * 1000


0

Si desea obtener la fecha de ayer y formatear esa fecha en un formato legible para humanos, considere crear un DateHelperobjeto personalizado que se vea así:

var DateHelper = {
    addDays : function(aDate, numberOfDays) {
        aDate.setDate(aDate.getDate() + numberOfDays); // Add numberOfDays
        return aDate;                                  // Return the date
    },
    format : function format(date) {
        return [
           ("0" + date.getDate()).slice(-2),           // Get day and pad it with zeroes
           ("0" + (date.getMonth()+1)).slice(-2),      // Get month and pad it with zeroes
           date.getFullYear()                          // Get full year
        ].join('/');                                   // Glue the pieces together
    }
}

// With this helper, you can now just use one line of readable code to :
// ---------------------------------------------------------------------
// 1. Get the current date
// 2. Subtract 1 day
// 3. Format it
// 4. Output it
// ---------------------------------------------------------------------
document.body.innerHTML = DateHelper.format(DateHelper.addDays(new Date(), -1));

(ver también este violín )


0

Puede usar momentjs, es muy útil, puede lograr muchas cosas con esta biblioteca.

Obtenga la fecha de ayer con el tiempo actual moment().subtract(1, 'days').toString()

Obtenga la fecha de ayer con un inicio de la fecha moment().subtract(1, 'days').startOf('day').toString()


0

resolver el problema de la fecha límite (2020, 01, 01) -> 2019, 12, 31

var now = new Date();
return new Date(now.getMonth() - 1 === 0 ? now.getFullYear() - 1 : now.getFullYear(),
                now.getDate() - 1 === 0 ? now.getMonth() - 1: now.getMonth(),
                now.getDate() - 1);

-1

"Date.now () - 86400000" no funcionará en el día de finalización del horario de verano (que tiene 25 horas ese día)

Otra opción es usar Closure:

var d = new goog.date.Date();
d.add(new goog.date.Interval(0, 0, -1));
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.