2009-10-02 19 views
44

Grałem około z Javascript tworząc prosty zegar odliczający kiedy natknąłem tego dziwnego zachowania:Funkcja JavaScript Date.UTC() jest wyłączona przez miesiąc?

var a = new Date(), 
now = a.getTime(), 
then = Date.UTC(2009,10,31), 
diff = then - now, 
daysleft = parseInt(diff/(24*60*60*1000)); 
console.log(daysleft); 

Dni pozostawione jest wyłączony przez 30 dni.

Co jest nie tak z tym kodem?

Edytuj: Zmieniłem nazwy zmiennych, aby były bardziej przejrzyste.

+0

powiązane: http://stackoverflow.com/q/20806052/1048572 – Bergi

Odpowiedz

85

Miesiąc jest oparty na zera dla JavaScript.

Dni i lata są oparte na jednym dokumencie.

Idź.

UPDATE

Powodem tego jest to, ze creator of JavaScript jest

JS had to "look like Java" only less so, be Java's dumb kid brother or boy-hostage sidekick. Plus, I had to be done in ten days or something worse than JS would have happened.

http://www.jwz.org/blog/2010/10/every-day-i-learn-something-new-and-stupid/#comment-1021

+13

Ha. Dziękuję Ci. To znaczy, że w końcu nie tracę rozumu. – picardo

+3

Niezły cytat, ale Eich mówi tam o liczbach całkowitych. Oto część o Dacie, z tego samego źródła: * "Miałem pomoc tylko dla jsdate.c, od Kena Smitha z Netscape (który, według naszej zbyt optymistycznej zgody, sklonował java.util.Date - błędy Y2K i wszystkie ! Gosling ...) "* – user123444555621

6

Jak wspomniano Eric, to ze względu na miesięcy jest na liście 0-11 zakresu .

Jest to typowe zachowanie - tak samo jest w przypadku Perla wynika z localtime() i prawdopodobnie z wielu innych języków.

Najprawdopodobniej oryginalnie odziedziczył on połączenie lokalne() w systemie UNIX. (wykonaj "man localtime")

Powodem jest to, że dni/lata są ich liczbami całkowitymi, podczas gdy miesiące (jako #) są indeksami tablicy, która w większości języków - szczególnie C, gdzie wywołanie bazowe jest zaimplementowane na Unix - zaczyna się od 0.

-2
date1 = new Date(); 
//year, month, day [, hrs] [, min] [, sec] 
date1 = new Date.UTC(date1.getFullYear(),date1.getMonth()+1,date1.getDate(),date1.getHours(),date1.getMinutes(),date1.getSeconds()); 

date2 = new Date(); 
date2 = date2.getTime(); 

alert(date1) 
alert(date2) 
+0

Nie jestem pewien, co tu robisz, a kod nie działa (' TypeError: funkcja UTC() {[native code]} nie jest konstruktorem '). –

Powiązane problemy