Calculez la date d'hier en JavaScript

279

Comment puis-je calculer hier comme date en JavaScript?

Oméga
la source

Réponses:

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
la source
12
Agréable. À première vue, il pourrait sembler que cela échouerait en tant que getDateretourne le jour du mois (par exemple: 1 - 31) mais setDate(0)définit en fait la date au dernier jour du mois précédent. Est-ce que cela fonctionne sur tous les navigateurs?
Drew Noakes
1
Impossible de vérifier "tous" les navigateurs mais j'ai travaillé sur tout ce que j'ai testé camo.githubusercontent.com/…
James Kyburz
1
@Zargold Je ne comprends pas ce que tu veux dire. node --version v9.4.0 node 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 oui, je viens de le tester directement et vous avez raison, je ne sais pas comment mon cas d'utilisation était différent et depuis, complètement refactorisé. Je ne pourrai donc pas voir.
Zargold
91

Pas très efficace, mais comme oneliner:

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

Ce qui précède crée trois Dateobjets qui sont inutilement inutiles. Cela peut être réduit à une seule instanciation avec:

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

Ou, si vous préférez:

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

Ou, si vous préférez ES6 avec fonction flèche:

let yesterday = ( d => new Date(d.setDate(d.getDate()-1)) )(new Date);
KooiInc
la source
6
Je préfère éviter de jouer avec la portée:var yesterday = (function(d){ d.setDate(d.getDate()-1); return d})(new Date)
Roy Tinker
4
Si vous avez besoin d'une doublure, utilisez quelque chose comme la nouvelle date (Date.now () - 24 * 60 * 60 * 1000); cela a l'avantage de ne créer qu'un seul objet Date. Mais honnêtement, celui qui maintient ce code sera beaucoup plus heureux de voir la version claire à 2 lignes qu'ils ne lanceraient des fonctions (ou des millisecondes, d'ailleurs).
Rob Whelan
66

Essaye ça

var d = new Date();
d.setDate(d.getDate() - 1);
ashishjmeshram
la source
1
Commande suivante d.setHours (19,59); Pour régler l'heure à 19 h 59
James Jenkins le
60

Étonnamment, aucun point de réponse à la solution de navigateur croisé la plus simple

Pour trouver exactement la même heure hier:

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

C'est si vous voulez aller sans dépendance, sinon je recommanderais d'utiliser http://momentjs.com

Fabiano Soriani
la source
7
Comment cela fonctionne-t-il lorsque l'heure d'été change? Cela ne ferait-il pas avancer ou reculer d'une heure?
Adam Tegen du
19

Pour généraliser la question et effectuer d'autres calculs de diff, utilisez:

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

cela crée un nouvel objet de date basé sur la valeur de "maintenant" comme un entier qui représente l'époque unix en millisecondes soustrayant un jour.

Il y a deux jours:

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

Il y a une heure:

var oneHourAgo = new Date((new Date()).valueOf() - 1000*60*60);
Ami Heines
la source
Cela semble être la méthode la plus sûre car nous fonctionnons à l'époque unix exprimée en millisecondes. L'arithmétique est donc plus sûre que de faire quelque chose comme getDate () - 1. Je n'ai pas essayé getDate () - 1, mais basé sur la documentation de getDate (), il retournera 1 si la date d'aujourd'hui est le 1er de n'importe quel mois. Et 1-1 = 0 n'est pas une date valide. Je ne sais pas comment setDate (0) fonctionnera.
Kapil Pendse
1
C'était mon approche, bien que vous puissiez aussi la simplifier un peu - essayez quelque chose comme new Date (Date.now () - 24 * 60 * 60 * 1000);
Rob Whelan
setDate (0), btw, serait bien - il retournerait au dernier jour du mois précédent. Mais il semble plus ordonné (et plus intuitif) de laisser tomber la représentation en millisecondes ici, pour moi - le seul inconvénient est que le "nombre de millis par jour" n'est pas aussi évident, il pourrait donc être facile de mal saisir ce calcul.
Rob Whelan
Travailler avec le temps Unix semble être l'option la plus fiable. Cela devrait être évalué plus haut.
Paul
Oui, j'aime le mieux cette approche. Il y a moins d'ambiguïté. J'ai fini par y aller new Date(Date.parse(new Date()) - 86400000). Bien que j'aime Date.now (), je vais peut-être essayer à la place. Cela fera gagner une date supplémentaire.
coblr
9

J'utilise la bibliothèque moment , elle est très flexible et facile à utiliser.

Dans ton cas:

let yesterday = moment().subtract(1, 'day').toDate();
guyaloni
la source
2
vous feriez mieux d'utiliser subtractau lieu deadd
Thomas Ayoub
Fonctionne bien aussi! Beau travail pour ng FullCalendar et son validRange
XenoX
8
new Date(new Date().setDate(new Date().getDate()-1))
Gopinath Radhakrishnan
la source
3
Pourriez-vous ajouter un peu d'explication? Les blocs de code simples seuls ne sont pas du tout utiles
CertainPerformance
Fonctionne bien! Merci
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
la source
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
la source
5

Cela produira hier à 00h00 avec une précision de minutes

var d = new Date();
d.setDate(d.getDate() - 1);
d.setTime(d.getTime()-d.getHours()*3600*1000-d.getMinutes()*60*1000);
Evgeni Makarov
la source
2
d.setHours(0,0,0,0);

fera l'affaire

godzillante
la source
1
Est-ce que cela va? Je pensais que cela mettait simplement vos heures, minutes et secondes à 0, mais ne change-t-il pas réellement la date?
Jesper Bylund
Je devais utiliser des nombres négatifs pour obtenir hier: d.setHours(-1,0,0,0). Cela retournera la date d'hier, mais ce n'est peut-être pas l'heure que vous voulez (23:00:00)
cs_pupil
1

Essayez ceci, fonctionne pour moi:

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

Cela m'a fait récupérer un objet date pour hier

Ken Ye
la source
1
Étant donné que vous utilisez today.setDate, la date d'aujourd'hui passera également à hier. Il est préférable de créer la variable d'hier puis de la définir. var yesterday = new Date(); yesterday.setDate(today.GetDate() - 1)afin que vous puissiez utiliser à la fois aujourd'hui et hier
PersyJack
1

Voici une ligne qui est utilisée pour obtenir la date d'hier au format AAAA-MM-JJ dans le texte et gérer le décalage du fuseau horaire.

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

Il peut évidemment être changé en date de retour, x jours en arrière. Pour inclure le temps, 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

Griffon
la source
0

Si vous souhaitez à la fois obtenir la date d'hier et formater cette date dans un format lisible par l'homme, envisagez de créer un DateHelperobjet personnalisé qui ressemble à ceci:

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));

(voir aussi ce violon )

John Slegers
la source
0

Vous pouvez utiliser momentjs, il est très utile de réaliser beaucoup de choses avec cette bibliothèque.

Obtenez la date d'hier avec le calendrier actuel moment().subtract(1, 'days').toString()

Obtenez la date d'hier avec un début de date moment().subtract(1, 'days').startOf('day').toString()

Abhishek Kumar Pandey
la source
0

résoudre le problème de date limite (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
la source
-1

"Date.now () - 86400000" ne fonctionnera pas le jour de fin de l'heure d'été (qui compte 25 heures ce jour-là)

Une autre option consiste à utiliser la fermeture:

var d = new goog.date.Date();
d.add(new goog.date.Interval(0, 0, -1));
user10605953
la source