web-dev-qa-db-fra.com

moment.js - teste si une date est aujourd'hui, hier, dans une semaine ou deux

J'essaie avec moment.js de savoir si une date est aujourd'hui, hier, il y a une semaine ou plus ancienne (il y a deux semaines ou plus).

Je l'ai déjà fait pour les deux premiers cas:

var today = moment().startOf('day');
var yesterday = moment().subtract(1, 'days').startOf('day');

if (moment(localTime).isSame(today, 'd')) // today
    // do something
if (moment(localTime).isSame(yesterday, 'd')) // yesterday
    // do something

Est-ce exact?

Cependant, comment puis-je vérifier si une date date d'une semaine ou plus (par exemple il y a deux semaines)?

34
William Poussier

Voici quelque chose qui peut être utile:

var REFERENCE = moment("2015-06-05"); // fixed just for testing, use moment();
var TODAY = REFERENCE.clone().startOf('day');
var YESTERDAY = REFERENCE.clone().subtract(1, 'days').startOf('day');
var A_WEEK_OLD = REFERENCE.clone().subtract(7, 'days').startOf('day');

function isToday(momentDate) {
    return momentDate.isSame(TODAY, 'd');
}
function isYesterday(momentDate) {
    return momentDate.isSame(YESTERDAY, 'd');
}
function isWithinAWeek(momentDate) {
    return momentDate.isAfter(A_WEEK_OLD);
}
function isTwoWeeksOrMore(momentDate) {
    return !isWithinAWeek(momentDate);
}

console.log("is it today? ..................Should be true: "+isToday(moment("2015-06-05")));
console.log("is it yesterday? ..............Should be true: "+isYesterday(moment("2015-06-04")));
console.log("is it within a week? ..........Should be true: "+isWithinAWeek(moment("2015-06-03")));
console.log("is it within a week? ..........Should be false: "+isWithinAWeek(moment("2015-05-29")));
console.log("is it two weeks older or more? Should be false: "+isTwoWeeksOrMore(moment("2015-05-30")));
console.log("is it two weeks older or more? Should be true: "+isTwoWeeksOrMore(moment("2015-05-29")));

Vérifiez une démo de JSFiddle avec plus de tests, afin de pouvoir ajuster votre cas exact, si nécessaire.

68
acdcjunior

Réponse plus précise comme suit

var today = moment();
var yesterday = moment().subtract(1, 'day');

var engagementDate = (Date to be compare);

if(moment(engagementDate).isSame(today, 'day'))
  console.log('Today');
else if(moment(engagementDate).isSame(yesterday, 'day'))
  console.log('Yesterday');
14
Gurpinder

La fonction diff peut être utile pour votre cas et, en général, pour vérifier les jours exacts depuis une date

var sampleDaysAgo = moment().subtract(28, 'days'); //28 just for test
var today = moment();

console.log(today.diff(sampleDaysAgo, 'days')); // 28 

Démo

3
will

A partir de la version 2.14, vous pouvez personnaliser la fonction calendar()

moment().calendar(YOUR_DATE, {
  sameDay: function (now) {
    if (this.isBefore(now)) {
      return '[Will Happen Today]';
    } else {
      return '[Happened Today]';
    }
    /* ... */
  }
});

Ceci est conçu pour les événements de type "calendrier".

http://momentjs.com/docs/#/displaying/calendar-time/

0
Simon_Weaver

Le moment contient déjà une logique de cette nature

Vous pouvez consulter leur code source pour le code humanizehttps://github.com/moment/moment/blob/ed1fc742b179708d0a987a639979178616309f93/src/lib/during/humanize.js

et la logique fromNow

https://github.com/moment/moment/blob/497f918515ae6ab900f008f19523b1e4ae5e2450/src/lib/moment/from.js

J'ai trouvé cela utile pour voir comment ils l'ont fait.

La façon dont vous formatez la chaîne dépend de votre entreprise et, pour être honnête, la logique intégrée ne la coupera probablement pas la plupart du temps. Cela semble logique pour la date d'un "article" où "il y a quelques jours" est acceptable, mais je suis en train de suivre les colis par courrier et de dire "Votre colis expédié il y a quelques jours" n'est tout simplement pas suffisant.

0
Simon_Weaver