2012-02-29 13 views
5

Ho due caselle di testo che accettano rispettivamente Start Date e End Date, nel formato AAAA/MM/GG.Data sottrazione in JavaScript

Devo avvisare l'utente se seleziona una data di fine che supera la data di inizio di 50 giorni.

Ecco quello che ho finora:

var startDate = new Date(document.getElementsByName('MYSTARTDATE').value); 
var endDate = new Date(document.getElementsByName('MYENDDATE').value); 
if ((endDate - startDate) > 50) 
{ 
    alert('End date exceeds specification'); 
    return false; 
} 

Per fare un esempio, quando seleziono Data inizio come 2012/01/22 e Data fine come 2012/02/29

startDate = 'Sun Jan 22 00:00:00 UTC +0530 2012' 
endDate = 'Wed Feb 29 00:00:00 UTC +0530 2012' 

E il risultato per endDate - startDate è 3283200000, invece di 38. Cosa sto facendo male?

risposta

9

3283200000 è di 38 giorni in millisecondi.

38 giorni x 24 ore x 60 minuti x 60 secondi x 1000 millisecondi

Inoltre, ci sono 38 giorni tra tali due date, non 39.

Una soluzione semplice è quella di avere una variabile (costante veramente) definito come il numero di millisecondi in un giorno:

var days = 24*60*60*1000; 

E utilizzare tale variabile come "unità" nel confronto:

if ((endDate - startDate) > 50*days) { 
    ... 
} 
+0

oh..so suppongo che ho solo bisogno di dividere la differenza di (24x60x60x1000) poi. Grazie! – user656523

+0

Sì, consultare la mia modifica per una soluzione facile e leggibile dall'utente. –

0

La soluzione di Jeff B non è corretta a causa dell'ora legale. Se la data di inizio è, ad esempio, il 31 ottobre e la data di fine è il 20 dicembre, la quantità di tempo effettivamente trascorso tra queste due volte è di 50 giorni più 1 ora, non di 50 giorni. Ciò è particolarmente grave se il tuo programma non si preoccupa dell'ora del giorno e imposta tutte le ore a mezzanotte: in tal caso, tutti i calcoli saranno disattivati ​​di uno per l'intero inverno.

Parte del modo corretto di sottrarre le date consiste nell'istanziare un nuovo oggetto Date per ciascuna delle volte e quindi utilizzare una matrice con il numero di giorni in ogni mese per calcolare quanti giorni sono effettivamente passati.

Ma per peggiorare le cose, le date che l'Europa cambia gli orologi sono diverse rispetto alle date in cui gli orologi vengono cambiati a New York. Pertanto, il fuso orario non è sufficiente per determinare quanti giorni sono trascorsi; anche la posizione è necessaria.

Il risparmio di luce diurna aggiunge una notevole complessità alla gestione della data. Nel mio sito Web, la funzione necessaria per calcolare con precisione il numero di giorni trascorsi è di circa un centinaio di righe. La complessità effettiva dipende dal fatto che i calcoli siano lato client o lato server o entrambi e chi sta visualizzando i dati.