Perché Javascript getYear () restituisce 108?

Perché questo javascript restituisce 108 anziché il 2008? ottiene il giorno e il mese corretti ma non l’anno?

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

anno = 108?

È una cosa Y2K , contano solo gli anni dal 1900.

Ci sono potenziali problemi di compatibilità ora che getYear() è stato deprecato a favore di getFullYear() – da quirksmode :

Per rendere la questione ancora più complessa, date.getYear () è oggettivamente obsoleto e dovresti usare date.getFullYear (), che, a sua volta, non è supportato dai browser più vecchi. Se funziona, tuttavia, dovrebbe sempre dare l’anno completo, vale a dire. 2000 invece di 100.

Il tuo browser dà gli anni successivi con questi due metodi:

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

Ci sono anche differenze di implementazione tra Internet Explorer e Firefox, poiché l’implementazione di IE di getYear() stata modificata per comportarsi come getFullYear() – da IBM :

Per la specifica ECMAScript, getYear restituisce l’anno meno 1900, originariamente pensato per restituire “98” per il 1998. getYear è stato deprecato in ECMAScript versione 3 e sostituito con getFullYear ().

Internet Explorer ha cambiato getYear () per funzionare come getFullYear () e renderlo conforms a Y2k, mentre Mozilla ha mantenuto il comportamento standard.

Dato che getFullYear non funziona con i browser più vecchi, puoi usare qualcosa del genere:

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

Il prototipo di Javascript può essere utilizzato per estendere oggetti esistenti, proprio come i metodi di estensione C #. Ora, possiamo solo farlo;

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

Controlla i documenti. Non è un problema Y2K – è una mancanza di un problema Y2K! Questa decisione è stata presa originariamente in C ed è stata copiata in Perl, apparentemente JavaScript, e probabilmente in molte altre lingue. Molto tempo fa sembrava apparentemente desiderabile usare anni a due cifre, ma notevolmente chi ha progettato quell’interfaccia ha avuto abbastanza lungimiranza per capire che avevano bisogno di pensare a cosa sarebbe successo nel 2000 e oltre, così invece di fornire solo gli ultimi due cifre, hanno fornito il numero di anni dal 1900. Potresti usare le due cifre, se fossi di fretta o volessi essere rischioso. O se vuoi che il tuo programma continui a funzionare, puoi aggiungere 100 al risultato e utilizzare anni a quattro cifre a pieno titolo.

Ricordo la prima volta che ho effettuato la manipolazione della data in Perl. Stranamente ho letto i documenti . Apparentemente questa non è una cosa comune. Un anno o due dopo sono stato chiamato in ufficio il 31 dicembre 1999 per sistemare un bug che era stato scoperto all’ultimo minuto in un codice Perl del contratto, roba con cui non avevo mai avuto niente a che fare. Era questo il problema esatto: la data chiamata standard restituito anni dal 1900, e i programmatori trattati come un anno a due cifre. (Presumevano che avrebbero ottenuto “00” nel 2000.) Da giovane programmatore inesperto, mi è venuto in mente che avremmo pagato così tanto per un lavoro “professionale”, e quelle persone non si erano nemmeno prese la briga di leggere il documentazione. Fu l’inizio di molti anni di disillusione; ora sono vecchio e cinico. 🙂

Nel 2000, la conferenza annuale YAPC Perl è stata chiamata “YAPC 19100” in onore di questo non-bug spesso riportato.

Al giorno d’oggi, almeno nel mondo Perl, ha più senso usare un modulo standard per la gestione delle date, uno che usa anni reali a quattro cifre. Non sono sicuro di cosa potrebbe essere disponibile per JavaScript.

Deve restituire il numero di anni dall’anno 1900.

usa date.getFullYear() .

Questo è (come giustamente sottolineato altrove) è una cosa Y2K. Netscape (scritto prima del 2000) originariamente restituito, ad esempio 98 da getYear() . Invece di tornare a 00 , restituiva invece 100 per l’anno 2000. Poi arrivarono altri browser e lo fecero in modo diverso, e tutti erano infelici come l’incompatibilità regnava.

I browser successivi supportano getFullYear come metodo standard per restituire l’anno completo.

Questa domanda è così vecchia che mi fa piangere la nostalgia dei giorni delle dotcom!

Esatto, Date.getYear () restituisce il numero di anni trascorsi dal 1900, proprio come il localtime di Perl (). Ci si chiede perché una lingua progettata negli anni ’90 non rappresenterebbe il giro d’affari del secolo, ma cosa posso dire? Dovevi essere lì. In un certo senso aveva una specie di senso al momento (come pets.com).

Prima del 2000, si sarebbe potuto essere tentati di correggere questo bug aggiungendo “19” al risultato di getYear () risultante nel “bug dell’anno 19100” . Altri hanno già risposto a questa domanda sufficientemente (aggiungi 1900 al risultato di getDate ()).

Forse il libro che stai leggendo su JavaScript è un po ‘vecchio?

Grazie per l’esplosione del passato!

Dovresti, come sottolineato, non usare mai getYear() , ma usare invece getFullYear() .

La storia non è così semplice come “IE implementa GetYear() come getFullYear() . Opera e IE in questi giorni trattano getYear() come getYear() stato originariamente specificato per le date precedenti al 2000, ma lo tratterà come getFullYear() per le date dopo il 2000, mentre webkit e Firefox si attaccano al vecchio comportamento

Questo produce 99 in tutti i browser:

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

Questo produce 108 in FF / WebKit e nel 2008 in Opera / IE:

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

È stupido. Risale ai giorni precedenti a Y2K e ora restituisce il numero di anni trascorsi dal 1900 per motivi legacy. Utilizza getFullYear () per ottenere l’anno effettivo.

Sto usando date.getUTCFullYear() ; lavorando senza problemi.

Il numero che ottieni è il numero di anni dal 1900. Non chiedermi perché ..

restituisce un anno a 4 cifre – 1900, che potrebbe essere stato bello più di 9 anni fa, ma ora è piuttosto ritardato. Anche Java java.util.Date fa questo.

Come altri hanno già detto, restituisce il numero di anni trascorsi dal 1900. Il motivo per cui ciò accade è che quando JavaScript è stato inventato a metà degli anni ’90, tale comportamento era sia conveniente che coerente con le API di data e ora in altre lingue. In particolare C. E, ovviamente, una volta stabilita l’API, non è stato ansible cambiarla per ragioni di compatibilità a ritroso.

A proposito, diversi browser potrebbero restituire risultati diversi, quindi è meglio saltare questa funzione del tutto e utilizzare sempre getFullYear ().

var date_object = new Date (); var year = date_object.getYear (); se (anno <2000) {anno = anno + 1900; } // u otterrà l'intero anno ....