2009-10-02 4 views
44

Je jouais avec Javascript créer une simple horloge du compte à rebours quand je suis tombé sur ce comportement étrange:Javascript La fonction Date.UTC() est désactivée depuis un mois?

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

Les jours restants est hors de 30 jours.

Quel est le problème avec ce code? Editer: J'ai changé les noms des variables pour le rendre plus clair.

+0

Connexe: http://stackoverflow.com/q/20806052/1048572 – Bergi

Répondre

85

Le mois est basé sur zéro pour JavaScript.

Les jours et les années sont basés sur un seul.

Allez à la figure.

MISE À JOUR

La raison pour laquelle il en est ainsi, de la creator of JavaScript, est

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. Je vous remercie. Cela signifie que je ne perds pas la tête après tout. – picardo

+3

Belle citation, mais Eich parle d'Integers là-bas. Voici la partie sur Date, de la même source: * "Je n'ai eu d'aide que pour jsdate.c, de Ken Smith de Netscape (qui, selon notre accord trop optimiste, clonait java.util.Date - bugs Y2K et tous ! Gosling ...) "* – user123444555621

6

Comme Eric a dit, cela est dû à plusieurs mois étant classé 0-11 gamme .

Ceci est un comportement commun - c'est la même chose pour les résultats Perl de localtime(), et probablement beaucoup d'autres langues.

Cela a probablement été hérité de l'appel localtime() d'Unix.

La raison en est que les jours/années sont leurs propres entiers, tandis que les mois (en tant que #) sont des index d'un tableau, qui dans la plupart des langues - en particulier C où l'appel sous-jacent est implémenté sur Unix - commence par 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

Je ne suis pas sûr de ce que vous faites ici, et le code ne fonctionne pas (' TypeError: la fonction UTC() {[code natif]} n'est pas un constructeur '). –

Questions connexes