2015-06-05 5 views
20

Ich versuche mit moment.js zu wissen, ob ein Datum heute, gestern, vor 1 Woche oder älter ist (vor 2 Wochen oder mehr).moment.js - testen Sie, ob ein Datum heute, gestern, vor einer Woche oder zwei Wochen ist

ich schon, dass in den ersten beiden Fällen geschehen:

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 richtig?

Wie könnte ich jedoch überprüfen, ob ein Datum vor einer Woche oder älter ist (zB vor zwei Wochen)?

+1

Was ist "1 Woche"? Vorgestern, aber nach letztem Freitag (denn heute ist Freitag)? – acdcjunior

+0

Suchen Sie nur nach den Funktionen 'isBefore' und' isAfter'? Oder etwas mehr? –

+0

@acdcjunior Du hast es, das ist genau das. Ich sollte sagen 7 Tage vorher. –

Antwort

47

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

Check a JSFiddle demo mit mehr Tests, so dass Sie für Ihren konkreten Fall zwicken, wenn nötig.

+0

Sehr schön. Ich habe versucht, es selbst zu erreichen, und ich war nicht so weit von deiner Lösung entfernt, ich habe nur den 'clone()' vergessen und ich habe deswegen merkwürdige Ergebnisse bekommen. –

+4

Ja, das liegt daran, dass 'moment()' Objekte veränderbar sind. Wenn Sie 'someDatesubtract()' aufrufen, ändert sich tatsächlich der 'someDate'-Wert. In vielen Sprachen sind die Datumsobjekte unveränderlich, daher kann die Veränderlichkeit von moment.js tatsächlich seltsame Ergebnisse liefern. – acdcjunior

+0

Ich glaube nicht, dass startOf() notwendig ist, außer für A_WEEK_OLD – Jonah

8

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

Die diff Funktion für Ihren Fall könnte hilfreich sein, und im allgemeinen, seit einem Zeitpunkt die genauen Tage zu überprüfen

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

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

Demo

0

Moment enthält bereits eine Logik dieser Art

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

und der fromNow Logik

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

ich diesen nützlich gefunden aussehen wollen, um zu sehen, wie sie es taten.

Die Art, wie Sie die Zeichenkette formatieren, hängt von Ihrem Geschäft ab, und um ehrlich zu sein, wird die eingebaute Logik wahrscheinlich die meiste Zeit nicht schneiden. Es scheint sinnvoll für das Datum eines 'Post' zu sein, wo 'vor ein paar Tagen' in Ordnung ist, aber ich verfolge Pakete in der Post und sage 'Dein Paket wurde vor ein paar Tagen verschickt' ist einfach nicht gut genug.

0

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

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

Dies ist für 'Kalender' Typ Ereignisse anzupassen.

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

Verwandte Themen