2012-02-29 12 views
5

Mam dwa pola tekstowe, które akceptują odpowiednio Start Date i End Date, w formacie RRRR/MM/DD.Odejmowanie dat w JavaScript

Muszę powiadomić użytkownika, jeśli wybierze datę zakończenia, która przekroczy datę rozpoczęcia o 50 dni.

Oto co mam do tej pory:

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; 
} 

Tylko jako przykład, kiedy wybrać Data rozpoczęcia jako 2012/01/22 i zakończenia jako 2012/02/29

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

a wynik dla endDate - startDate jest 3283200000, zamiast 38. Co robię źle?

Odpowiedz

9

3283200000 jest 38 dni w milisekundach.

dni x 38 x 24 godzin, 60 minut x 60 sekund x 1000 milisekund

Ponadto, istnieje 38 dni pomiędzy tymi dwiema datami, a nie 39.

Prostym rozwiązaniem jest zmienną (stały naprawdę) definiuje się jako liczbę milisekund w dzień:

var days = 24*60*60*1000; 

i użyć jej jako zmiennej „jednostka” w swojej porównania:

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

oh ... tak myślę, że po prostu muszę podzielić różnicę przez (24x60x60x1000) then.Thanks! – user656523

+0

Tak, zobacz moją edycję, aby uzyskać łatwe, czytelne dla użytkownika rozwiązanie. –

0

Rozwiązanie autorstwa Jeffa B jest nieprawidłowe, ze względu na czas letni. Jeśli data rozpoczęcia to, powiedzmy, 31 października, a data zakończenia jest 20 grudnia, czas, który faktycznie upłynął między tymi dwoma czasami wynosi 50 dni plus 1 godzina, a nie 50 dni. Jest to szczególnie złe, jeśli twój program nie dba o porę dnia i ustawia się zawsze o północy - w takim przypadku wszystkie obliczenia byłyby wyłączone o jedną przez całą zimę.

Częścią prawidłowego sposobu odejmowania dat jest utworzenie nowego obiektu Date dla każdego z czasów, a następnie użycie tablicy z liczbą dni w każdym miesiącu, aby obliczyć, ile dni faktycznie minęło.

Jednak, aby coś pogorszyć, daty, w których Europa zmienia zegary, różnią się od dat, w których zegary są zmieniane w Nowym Jorku. Dlatego sama strefa czasowa nie jest wystarczająca do określenia, ile dni upłynęło; lokalizacja jest również konieczna.

Czas letni wpływa na złożoność obsługi. W mojej witrynie funkcja potrzebna do dokładnego obliczenia liczby przepracowanych dni to prawie sto linii. Rzeczywista złożoność zależy od tego, czy obliczenia są wykonywane po stronie klienta, czy po stronie serwera, a także tych, którzy przeglądają dane.