2015-06-05 18 views
20

Sto provando con moment.js per sapere se una data è oggi, ieri, 1 settimana fa, o più vecchio (2 settimane fa o più).moment.js - verifica se una data è oggi, ieri, entro una settimana o due settimane fa

ho già fatto per i primi due casi:

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 

E 'corretto?

Tuttavia, come posso verificare se una data è una settimana fa o più vecchia (ad esempio due settimane fa)?

+1

Che cosa è "1 giorno fa"? Prima di ieri, ma dopo lo scorso venerdì (perché oggi è venerdì)? – acdcjunior

+0

Stai solo cercando le funzioni 'isBefore' e' isAfter'? O qualcosa di più? –

+0

@acdcjunior Hai capito, questo è esatto. Dovrei dire 7 giorni prima. –

risposta

47

Ecco qualcosa che può essere 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"))); 

Check a JSFiddle demo con altri test, in modo da poter ottimizzare per il vostro caso esatto, se necessario.

+0

Molto bello. Stavo cercando di realizzarlo da solo, e non ero così lontano dalla tua soluzione, ho semplicemente dimenticato il 'clone()' e ho ottenuto risultati strani a causa di questo. –

+4

Sì, è perché gli oggetti 'momento()' sono mutabili. Se chiami 'someDate.subtract()', in realtà cambia il valore di 'someDate'. In molte lingue gli oggetti data sono immutabili, quindi la mutabilità di moment.js può produrre risultati strani. – acdcjunior

+0

Non penso che startOf() sia necessario, ad eccezione di A_WEEK_OLD – Jonah

8

risposta più precisa come segue

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

La funzione diff potrebbe essere utile per il vostro caso e, in generale, per verificare i giorni esatti da una data

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

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

Demo

0

Moment contiene già alcune logiche di questa natura

si consiglia di guardare il loro codice sorgente per il codice di humanize https://github.com/moment/moment/blob/ed1fc742b179708d0a987a639979178616309f93/src/lib/duration/humanize.js

e la logica fromNow

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

Ho trovato questo utile per vedere come hanno fatto.

Il modo in cui si formatta la stringa dipenderà dalla propria attività e, a essere sinceri, la logica incorporata probabilmente non la taglierà la maggior parte del tempo. Sembra logico che la data di un "post" dove "pochi giorni fa" sia accettabile, ma sto monitorando i pacchetti nella posta e dicendo "Il tuo pacco spedito pochi giorni fa" non è abbastanza buono.

0

Dalla versione 2.14 in poi è possibile personalizzare la funzione

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

Questo è stato progettato per eventi di tipo 'di calendario calendar().

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

Problemi correlati