¿Por qué Javascript getYear() devuelve un número de tres dígitos?

6 minutos de lectura

ctrlShiftAvatar de usuario de Bryan
ctrlShiftBryan

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

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

año = 108?

  • Oh, los pecados que cometimos tratando de pasar el Y2K.

    – DGentry

    18 de septiembre de 2008 a las 23:59

  • year = myDate.getFullYear() % 100;

    –Andrew Larsson

    4 de diciembre de 2012 a las 20:01


Avatar de usuario de ConroyP
ConroyP

Es un Y2K cosa, sólo se cuentan los años desde 1900.

Existen posibles problemas de compatibilidad ahora que getYear() ha sido desaprobado en favor de getFullYear() – de en modo capricho:

Para complicar aún más el asunto, date.getYear() está obsoleto hoy en día y debe 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 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() fue cambiado 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 la versión 3 de ECMAScript y se reemplazó con getFullYear().

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

  • Realmente me pregunto qué pensó el idiota, esa fue una buena idea. ¿Quién crea un problema Y2K 5 años después de Y2K?

    – Dakkaron

    15 de septiembre a las 13:48

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

  • Tal vez algo como Date.prototype.getRealYear = Date.prototype.getFullYear ? Date.prototype.getFullYear : function() { return this.getYear() + 1900; };

    – Valentín Golev

    25 de noviembre de 2009 a las 14:43

avatar de usuario de skiphoppy
saltarín

Revisa los documentos. No es un problema Y2K, ¡es la falta de un problema Y2K! Esta decisión se tomó originalmente en C y se copió en Perl, aparentemente en JavaScript, y probablemente en varios otros lenguajes. Aparentemente, hace mucho tiempo 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á, por lo que en lugar de solo proporcionar los dos últimos dígitos, proporcionaban el número de años desde 1900. Podría usar los dos dígitos, si tenía prisa o quería ser arriesgado. O si desea que su programa continúe funcionando, puede agregar 1900 al resultado y usar años completos de cuatro dígitos.

Recuerdo la primera vez que hice manipulación de fechas en Perl. Por extraño que parezca, yo leer los documentos. Aparentemente esto no es algo común. Uno o dos años más tarde me llamaron a la oficina el 31 de diciembre de 1999 para corregir un error que se había descubierto en el último minuto posible en un código de contrato de Perl, cosas con las que nunca había tenido nada que ver. Fue este problema exacto: la llamada de fecha estándar devolvió años desde 1900, y los programadores lo trataron como un año de dos dígitos. (Asumieron que obtendrían “00” en 2000). Como un joven programador sin experiencia, me sorprendió que habíamos pagado tanto más 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 YAPC Perl se denominó “YAPC 19100” en honor a este no error del que se informa con frecuencia.

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 use años reales de cuatro dígitos. No estoy seguro de lo que podría estar disponible para JavaScript.

  • jeje… me recuerda a la caricatura de Dilbert… “¿has leído la historia de un español llamado Manual?” 😉

    – Adhip Gupta

    20 de septiembre de 2008 a las 21:54

  • 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 legible por humanos del mes. Ejemplo: var ts = nueva Fecha(); var fullYear = (ts.getYear()+1900); Pero se prefiere usar getFullYear(). Ejemplo: var fullYear = new Date().getFullYear();

    – recursiva

    18 de mayo de 2018 a las 13:14


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

Avatar de usuario de Dan
Dan

usar date.getFullYear().

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

Compatible con navegadores posteriores getFullYear como método estándar para devolver el año completo.

avatar de usuario de jjohn
jjohn

¡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 daría cuenta de la rotación del 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 resultaba en el “error del año 19100”. Otros ya han respondido suficientemente a esta pregunta (agregue 1900 al resultado de getDate()).

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

¡Gracias por la explosión del pasado!

Usted debe, como se señaló, nunca usar getYear()pero en su lugar usa getFullYear().

Sin embargo, la historia no es tan simple como “IE implementa GetYear() como getFullYear(). Opera e IE estos días tratan getYear() como getYear() se especificó originalmente para fechas anteriores a 2000, pero lo tratará 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());

¿Ha sido útil esta solución?