webentwicklung-frage-antwort-db.com.de

moment.js - testet ob ein Datum heute, gestern, vor einer Woche oder zwei Wochen liegt

Ich versuche mit moment.js herauszufinden, ob ein Datum heute, gestern, vor einer Woche oder älter ist (mindestens 2 Wochen).

Ich habe das bereits für die ersten beiden Fälle getan:

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

Ist das korrekt?

Wie kann ich jedoch überprüfen, ob ein Datum vor einer Woche oder älter ist (z. B. vor zwei Wochen)?

34

Hier ist etwas, das nützlich sein kann:

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

Überprüfen Sie eine JSFiddle-Demo mit mehr Tests, damit Sie bei Bedarf den genauen Fall anpassen können.

68
acdcjunior

Genauere Antwort wie folgt

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

Die Funktion diff kann für Ihren Fall hilfreich sein und im Allgemeinen die genauen Tage seit einem Datum überprüfen

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

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

Demo

3
will

Ab Version 2.14 können Sie die Funktion calendar() anpassen

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

Dies ist für Ereignisse vom Typ "Kalender" vorgesehen.

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

0
Simon_Weaver

Der Moment enthält bereits eine solche Logik

Sie können den Quellcode für den humanize-Code betrachten https://github.com/moment/moment/blob/ed1fc742b179708d0a987a639979178616309f93/src/lib/duration/humanize.js

und die fromNow-Logik

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

Ich fand das nützlich, um zu sehen, wie sie es machten.

Die Art und Weise, wie Sie die Zeichenfolge formatieren, hängt von Ihrem Unternehmen ab. Um ehrlich zu sein, wird die integrierte Logik die meiste Zeit wahrscheinlich nicht beeinträchtigen. Es scheint sinnvoll für das Datum eines "Post" zu sein, bei dem "vor ein paar Tagen" in Ordnung ist, aber ich verfolge Pakete in der Post und sage "Ihr Paket wurde vor wenigen Tagen verschickt" ist einfach nicht gut genug.

0
Simon_Weaver