Calcule la fecha de ayer 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)
James Kyburz
fuente
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);
KooiInc
fuente
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);
ashishjmeshram
fuente
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

Fabiano Soriani
fuente
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);
Ami Heines
fuente
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();
guyaloni
fuente
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
8
new Date(new Date().setDate(new Date().getDate()-1))
Gopinath Radhakrishnan
fuente
3
¿Podría agregar un poco de explicación? Los bloques de código simple por sí solos no son tan útiles
CertainPerformance
Funciona bien ! Gracias
XenoX
7
//Create a date object using the current time
var now = new Date();

//Subtract one day from it
now.setDate(now.getDate()-1);
Billyhomebase
fuente
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);

Deepu Reghunath
fuente
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);
Evgeni Makarov
fuente
2
d.setHours(0,0,0,0);

hará el truco

Godzillante
fuente
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

Ken Ye
fuente
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

Grifo
fuente
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 )

John Slegers
fuente
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()

Abhishek Kumar Pandey
fuente
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);
Eric Chan
fuente
-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));
usuario10605953
fuente