Calculez la date d'hier en JavaScript


279

Comment puis-je calculer hier comme date en JavaScript?

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)

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

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


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


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

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

2
vous feriez mieux d'utiliser subtractau lieu deadd
Thomas Ayoub

Fonctionne bien aussi! Beau travail pour ng FullCalendar et son validRange
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

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

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

fera l'affaire


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


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


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 )


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


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

-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));
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.