¿Por qué Javascript getYear () devuelve 108?

95

¿Por qué este javascript devuelve 108 en lugar de 2008? ¿Obtiene el día y el mes correctos pero no el año?

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

año = 108?

ctrlShiftBryan
fuente
29
Oh, los pecados que cometimos al tratar de pasar el año 2000.
DGentry
3
year = myDate.getFullYear() % 100;
Andrew Larsson

Respuestas:

128

Es una cosa del año 2000 , solo se cuentan los años desde 1900.

Ahora hay problemas de compatibilidad potenciales que getYear()han quedado obsoletos en favor de getFullYear(), desde quirksmode :

Para hacer el asunto aún más complejo, date.getYear () está obsoleto hoy en día y debería usar date.getFullYear (), que, a su vez, no es compatible con los navegadores más antiguos. Sin embargo, si funciona, siempre debe dar el año completo, es decir. 2000 en lugar de 100.

Su navegador le da los siguientes años con estos dos métodos:

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

También hay diferencias de implementación entre Internet Explorer y Firefox, ya que la implementación de IE de getYear()se cambió para comportarse como getFullYear()- de IBM :

Según la especificación de ECMAScript, getYear devuelve el año menos 1900, originalmente destinado a devolver "98" para 1998. getYear quedó obsoleto en ECMAScript Versión 3 y se reemplazó por getFullYear ().

Internet Explorer cambió getYear () para que funcione como getFullYear () y lo haga compatible con Y2k, mientras que Mozilla mantuvo el comportamiento estándar.

ConroyP
fuente
25

Dado que getFullYear no funciona en navegadores antiguos, puede usar algo como esto:

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

El prototipo de Javascript se puede usar para extender objetos existentes, al igual que los métodos de extensión de C #. Ahora, podemos simplemente hacer esto;

var myDate = new Date();
myDate.getRealYear();
// Outputs 2008
FlySwat
fuente
7
¿Quizás algo como Date.prototype.getRealYear = Date.prototype.getFullYear? Date.prototype.getFullYear: function () {return this.getYear () + 1900; };
Valentin Golev
12

Consulte los documentos. No es un problema del Y2K, ¡es una falta de un problema del Y2K! Esta decisión se tomó originalmente en C y se copió en Perl, aparentemente JavaScript y probablemente en varios otros lenguajes. Hace mucho tiempo, aparentemente todavía se sentía deseable usar años de dos dígitos, pero sorprendentemente, quien diseñó esa interfaz tuvo suficiente previsión para darse cuenta de que necesitaban pensar en lo que sucedería en el año 2000 y más allá, así que en lugar de solo proporcionar los dos últimos dígitos, proporcionaron el número de años desde 1900. Podrías usar los dos dígitos, si tienes prisa o quieres arriesgar. O si desea que su programa continúe funcionando, puede agregar 100 al resultado y usar años completos de cuatro dígitos.

Recuerdo la primera vez que hice manipulación de citas en Perl. Curiosamente leí los documentos . Aparentemente esto no es algo común. Un año o dos después me llamaron a la oficina el 31 de diciembre de 1999 para arreglar un error que había sido descubierto en el último minuto posible en algún código Perl de contrato, cosas con las que nunca había tenido nada que ver. Fue exactamente este problema: la fecha estándar devolvió años desde 1900, y los programadores lo trataron como un año de dos dígitos. (Supusieron que obtendrían "00" en 2000.) Como programador joven y sin experiencia, me sorprendió que hubiéramos pagado tanto extra por un trabajo "profesional", y esas personas ni siquiera se habían molestado en leer el documentación. Fue el comienzo de muchos años de desilusión; ahora soy viejo y cínico. :)

En el año 2000, la conferencia anual de YAPC Perl se denominó "YAPC 19100" en honor a este error que a menudo se informa.

Hoy en día, al menos en el mundo de Perl, tiene más sentido usar un módulo estándar para el manejo de fechas, uno que usa años reales de cuatro dígitos. No estoy seguro de qué podría estar disponible para JavaScript.

skiphoppy
fuente
1
jeje ... me recuerda a la caricatura de Dilbert ... "¿has leído la historia de un español llamado Manual?" ;)
Adhip Gupta
Creo que @skiphoppy significaba que agregar 1900 a getYear () produciría el año completo deseado. Es similar a agregar +1 a getMonth () al recuperar el número del mes legible por humanos. Ejemplo: var ts = new Date (); var fullYear = (ts.getYear () + 1900); Pero se prefiere usar getFullYear (). Ejemplo: var fullYear = new Date (). GetFullYear ();
recurse
6

Debe devolver el número de años desde el año 1900.

Jeremy Ruten
fuente
4

utilizar date.getFullYear().

Esto es (como se señaló correctamente en otro lugar) es una cosa del año 2000. Netscape (escrito antes de 2000) regresó originalmente, por ejemplo, 98de getYear(). En lugar de volver a 00, regresó 100para el año 2000. Luego aparecieron otros navegadores y lo hicieron de manera diferente, y todos estaban descontentos porque reinaba la incompatibilidad.

Los navegadores posteriores son compatibles getFullYearcomo método estándar para devolver el año completo.

Dan
fuente
3

¡Esta pregunta es tan antigua que me hace llorar de nostalgia por los días de las puntocom!

Así es, Date.getYear () devuelve el número de años desde 1900, al igual que localtime () de Perl. Uno se pregunta por qué un lenguaje diseñado en la década de 1990 no representaría el cambio de siglo, pero ¿qué puedo decir? Había que estar allí. En cierto modo tenía sentido en ese momento (como lo hizo pets.com).

Antes de 2000, uno podría haber tenido la tentación de corregir este error agregando "19" al resultado de getYear (), lo que resultó en el "error del año 19100" . Otros ya han respondido suficientemente esta pregunta (agregue 1900 al resultado de getDate ()).

¿Quizás el libro que estás leyendo sobre JavaScript sea un poco antiguo?

¡Gracias por la explosión del pasado!

jjohn
fuente
La razón por la que el lenguaje (Perl) no lo tuvo en cuenta es porque estaba copiando ciegamente una decisión de diseño en C que se había tomado mucho antes. (¿20 años?)
skiphoppy
Estaba arrojando sombra sobre JavaScript, no Perl. Perl a menudo expone las rutinas C subyacentes de forma bastante directa. Como dices, es producto de su tiempo. JS, diseñado al menos una década después, podría haber tomado una ruta diferente.
jjohn
2

Como se señaló, nunca debe usar getYear(), sino usar getFullYear().

Sin embargo, la historia no es tan simple como "IE implementa GetYear()como getFullYear(). Opera e IE en estos días tratan getYear()como getYear()se especificó originalmente para fechas anteriores a 2000, pero lo tratarán como getFullYear()para fechas posteriores a 2000, mientras que webkit y Firefox mantienen el comportamiento anterior

Esto genera 99 en todos los navegadores:

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

Esto genera 108 en FF / WebKit y 2008 en Opera / IE:

javascript:alert(new Date().getYear());
Arve
fuente
1

Estoy usando date.getUTCFullYear(); trabajando sin problemas.

D3vito
fuente
0

El número que obtiene es el número de años desde 1900. No me pregunte por qué ...

Nils Pipenbrinck
fuente
0

Como han dicho otros, devuelve el número de años desde el año 1900. La razón por la que hace que es que cuando JavaScript fue inventado a mediados de los años 90, que el comportamiento era a la vez conveniente y consistente con las API de fecha y hora en otros idiomas. Particularmente C. Y, por supuesto, una vez que se estableció la API, no pudieron cambiarla por razones de compatibilidad con versiones anteriores.

user11318
fuente
0

Por cierto, diferentes navegadores pueden devolver resultados diferentes, por lo que es mejor omitir esta función por completo y usar getFullYear () siempre.

Milán Babuškov
fuente
0

var date_object = nueva fecha (); var year = date_object.getYear (); if (año <2000) {año = año + 1900; } // obtendrás el año completo ...


fuente
-1

está regresando el año de 4 dígitos: 1900, que puede haber sido genial hace más de 9 años, pero ahora está bastante retrasado. Java.util.Date de Java también hace esto.

user17163
fuente