web-dev-qa-db-fra.com

Pourquoi Javascript getYear () renvoie 108?

Pourquoi ce javascript renvoie-t-il 108 au lieu de 2008? il obtient le jour et le mois correct mais pas l'année?

myDate = new Date();
year = myDate.getYear();

année = 108?

92
ctrlShiftBryan

C'est une chose Y2K , seules les années depuis 1900 sont comptées.

Il y a des problèmes de compatibilité potentiels maintenant que getYear() a été déconseillé en faveur de getFullYear() - de quirksmode :

Pour rendre la question encore plus complexe, date.getYear () est obsolète de nos jours et vous devez utiliser date.getFullYear (), qui, à son tour, n'est pas pris en charge par les anciens navigateurs. Si cela fonctionne, cependant, il devrait toujours donner l'année complète, c'est-à-dire. 2000 au lieu de 100.

Votre navigateur donne les années suivantes avec ces deux méthodes:

* The year according to getYear(): 108
* The year according to getFullYear(): 2008

Il existe également des différences d'implémentation entre Internet Explorer et Firefox, car l'implémentation de getYear() par IE a été modifiée pour se comporter comme getFullYear() - de IBM :

Selon la spécification ECMAScript, getYear renvoie l'année moins 1900, initialement destiné à renvoyer "98" pour 1998. getYear a été déconseillé dans ECMAScript version 3 et remplacé par getFullYear ().

Internet Explorer a modifié getYear () pour fonctionner comme getFullYear () et le rendre compatible Y2k, tandis que Mozilla a conservé le comportement standard.

126
ConroyP

Étant donné que getFullYear ne fonctionne pas dans les anciens navigateurs, vous pouvez utiliser quelque chose comme ceci:

Date.prototype.getRealYear = function() 
{ 
    if(this.getFullYear)
        return this.getFullYear();
    else
        return this.getYear() + 1900; 
};

Le prototype Javascript peut être utilisé pour étendre des objets existants, tout comme les méthodes d'extension C #. Maintenant, nous pouvons simplement faire cela;

var myDate = new Date();
myDate.getRealYear();
// Outputs 2008
25
FlySwat

Vérifiez les documents. Ce n'est pas un problème Y2K - c'est un manque de problème Y2K! Cette décision a été prise à l'origine en C et a été copiée en Perl, apparemment en JavaScript, et probablement dans plusieurs autres langues. Il y a longtemps, il était apparemment encore souhaitable d'utiliser des années à deux chiffres, mais remarquablement celui qui a conçu cette interface avait suffisamment de prévoyance pour se rendre compte qu'il fallait réfléchir à ce qui se passerait en l'an 2000 et au-delà, donc au lieu de simplement fournir les deux dernières chiffres, ils ont fourni le nombre d'années depuis 1900. Vous pouvez utiliser les deux chiffres, si vous êtes pressé ou si vous voulez être risqué. Ou si vous vouliez que votre programme continue de fonctionner, vous pouvez ajouter 100 au résultat et utiliser des années à quatre chiffres à part entière.

Je me souviens de la première fois que j'ai fait une manipulation de date en Perl. Curieusement, je lire la documentation. Apparemment, ce n'est pas chose courante. Un an ou deux plus tard, j'ai été appelé au bureau le 31 décembre 1999 pour corriger un bug qui avait été découvert à la dernière minute possible dans un code Perl contractuel, des trucs avec lesquels je n'avais rien à voir. C'était exactement ce problème: l'appel de date standard renvoyait des années depuis 1900 et les programmeurs le traitaient comme une année à deux chiffres. (Ils ont supposé qu'ils obtiendraient "00" en 2000.) En tant que jeune programmeur inexpérimenté, cela m'a époustouflé que nous avions payé tellement plus pour un travail "professionnel", et ces gens n'avaient même pas pris la peine de lire le Documentation. Ce fut le début de nombreuses années de désillusion; maintenant je suis vieux et cynique. :)

En l'an 2000, la conférence annuelle YAPC Perl était appelée "YAPC 19100" en l'honneur de ce non-bug souvent signalé.

De nos jours, dans le monde Perl au moins, il est plus logique d'utiliser un module standard pour la gestion des dates, qui utilise de vraies années à quatre chiffres. Je ne sais pas ce qui pourrait être disponible pour JavaScript.

11
skiphoppy

Il doit renvoyer le nombre d'années depuis l'année 1900.

6
Jeremy Ruten

utilisez date.getFullYear().

C'est (comme indiqué ailleurs correctement) est une chose de l'an 2000. Netscape (écrit avant 2000) est retourné à l'origine, par exemple 98 De getYear(). Plutôt que de revenir à 00, Il a plutôt renvoyé 100 Pour l'an 2000. Ensuite, d'autres navigateurs sont arrivés et l'ont fait différemment, et tout le monde était mécontent de l'incompatibilité.

Les navigateurs ultérieurs ont pris en charge getFullYear comme méthode standard pour renvoyer l'année complète.

4
Dan

Cette question est tellement ancienne qu'elle me fait pleurer de nostalgie pour les jours dotcom!

C'est vrai, Date.getYear () renvoie le nombre d'années depuis 1900, tout comme localtime () de Perl. On se demande pourquoi une langue conçue dans les années 1990 ne rendrait pas compte du chiffre d'affaires du siècle, mais que dire? Vous deviez être là. Cela avait une sorte de sens à l'époque (comme le faisait pets.com).

Avant 2000, on aurait pu être tenté de corriger ce bogue en ajoutant "19" au résultat de getYear () résultant en "bogue de l'année 19100" . D'autres ont déjà suffisamment répondu à cette question (ajoutez 1900 au résultat de getDate ()).

Peut-être que le livre que vous lisez sur JavaScript est un peu vieux?

Merci pour l'explosion du passé!

3
jjohn

Vous devez, comme indiqué, ne jamais utiliser getYear(), mais plutôt utiliser getFullYear().

L'histoire n'est cependant pas aussi simple que "IE implémente GetYear() que getFullYear(). Opera et IE ces jours-ci) traiter getYear() comme getYear() a été initialement spécifié pour les dates antérieures à 2000, mais le traitera comme getFullYear() pour les dates postérieures à 2000, tandis que webkit et Firefox conservent l'ancien comportement

Cela donne 99 dans tous les navigateurs:

javascript:alert(new Date(917823600000).getYear());

Cela génère 108 dans FF/WebKit et 2008 dans Opera/IE:

javascript:alert(new Date().getYear());
2
Arve

J'utilise date.getUTCFullYear(); travailler sans problème.

1
D3vito

C'est idiot. Il date de jours antérieurs à l'an 20 , et renvoie maintenant simplement le nombre d'années depuis 1900 pour des raisons héritées. Utilisez getFullYear () pour obtenir l'année réelle.

1
joelhardi

Le nombre que vous obtenez est le nombre d'années depuis 1900. Ne me demandez pas pourquoi ..

0
Nils Pipenbrinck

Comme d'autres l'ont dit, il renvoie le nombre d'années depuis 1900. La raison pour laquelle il le fait que est que lorsque JavaScript a été inventé au milieu des années 90, ce comportement était à la fois pratique et cohérent avec la date et l'heure API dans d'autres langues. Particulièrement C. Et, bien sûr, une fois l'API établie, ils ne pouvaient pas la modifier pour des raisons de compatibilité descendante.

0
user11318

var date_object = new Date (); var year = date_object.getYear (); si (année <2000) {année = année + 1900; } // u aura l'année complète ....

0
vinoth

BTW, différents navigateurs peuvent retourner des résultats différents, il est donc préférable d'ignorer complètement cette fonction et d'utiliser toujours getFullYear ().

0
Milan Babuškov