2012-02-03 27 views
106

Ho due date di input che vanno dal controllo Raccoglitore di data. Ho selezionato la data di inizio 2/2/2012 e la data di fine 2/7/2012. Ho scritto il seguente codice per questo.JavaScript: Come calcolare il numero di giorni tra due date utilizzando javascript

dovrei ottenere come risultato 6, ma io sono sempre 5.

function SetDays(invoker) { 
    var start = $find('<%=StartWebDatePicker.ClientID%>').get_value(); 
    var end = $find('<%=EndWebDatePicker.ClientID%>').get_value(); 

    var oneDay=1000 * 60 * 60 * 24; 
    var difference_ms = Math.abs(end.getTime() - start.getTime()) 
    var diffValue = Math.round(difference_ms/oneDay); 
} 

qualcuno può dirmi come posso ottenere differenza esatta?

+1

ma ... 7 meno 2 è 5 ... – Pointy

+0

perché dovresti ottenere risultato = 6 ??? 07 - 02 = 05 giorni .... –

+0

Ma il range di giorni da 2 a 7 è 2,3,4,5,6,7 = 6 giorni. – Supr

risposta

296

http://momentjs.com/ o https://date-fns.org/

Da docs Moment:

var a = moment([2007, 0, 29]); 
var b = moment([2007, 0, 28]); 
a.diff(b, 'days') // =1 

o per includere l'inizio:

a.diff(b, 'days')+1 // =2 

Beats Messi ng con timestamp e fusi orari manualmente.

A seconda del caso d'uso specifico, è possibile

  1. Usa a/b.startOf('day') e/o a/b.endOf('day') per forzare il diff per essere inclusiva o esclusiva ai "fini" (come suggerito da @kotpal nei commenti) .
  2. Impostare il terzo argomento true per ottenere un valore in virgola mobile che è possibile quindi Math.floor, Math.ceil o Math.round secondo necessità.
  3. L'opzione 2 può essere ottenuta anche ottenendo 'seconds' anziché 'days' e dividendo poi per 24*60*60.
+0

Grazie ha funzionato per me. –

+12

momento.js darà un valore negativo se un

+4

Attenzione a ignorare la parte del tempo - altrimenti otterresti risultati diversi per la stessa data ma con tempi diversi (come da un controllo di selezione data). usa moment (someDate) .startOf ('day') per impostare esplicitamente la parte time su 00:00:00 prima di eseguire una diff (o qualsiasi altra operazione sensibile alla parte temporale dell'oggetto Date/moment) – kotpal

8

provare:

//Difference in days 

var diff = Math.floor((start - end)/86400000); 
alert(diff); 
+0

Penso che sia fondamentalmente giusto, ma non è essenzialmente lo stesso di quello che c'è nell'OP? – Pointy

+0

A causa del modo in cui l'ha scritto non me ne sono accorto, ma sì, praticamente! : P – Richard

+0

Questo è più pulito e molto leggibile. –

Problemi correlati