Pregunta

¿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?

¿Fue útil?

Solución

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

Hay posibles problemas de compatibilidad ahora que getYear() ha quedado obsoleto en favor de getFullYear() - de en modo capricho:

Para hacer el asunto aún más complejo, date.getYear() está en desuso hoy en día y deberías usar date.getFullYear(), que, a su vez, no es compatible con los navegadores más antiguos.Sin embargo, si funciona, siempre debería 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 existen 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 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ó con getFullYear().

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

Otros consejos

Dado que getFullYear no funciona en navegadores antiguos, puedes 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 utilizar para ampliar objetos existentes, de forma muy similar a los métodos de extensión de C#.Ahora podemos hacer esto;

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

Consulte los documentos.No es un problema del Y2K, ¡es la falta de un problema del Y2K!Esta decisión se tomó originalmente en C y se copió en Perl, aparentemente en JavaScript y probablemente en varios otros lenguajes.Hace mucho tiempo aparentemente todavía se consideraba deseable usar años de dos dígitos, pero sorprendentemente quien diseñó esa interfaz tuvo suficiente previsión para darse cuenta de que necesitaba pensar en lo que sucedería en el año 2000 y más allá, por lo que en lugar de simplemente proporcionar los dos últimos dígitos, proporcionaron el número de años desde 1900.Podrías usar los dos dígitos, si tuvieras prisa o quisieras arriesgarte.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 manipulé fechas en Perl.Por extraño que parezca, yo lee los documentos.Al parecer esto no es algo común.Uno o dos años después, el 31 de diciembre de 1999, me llamaron a la oficina para corregir un error que se había 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.Era exactamente este problema:la llamada de fecha estándar devolvió años desde 1900 y los programadores la trataron como un año de dos dígitos.(Asumieron que obtendrían "00" en 2000.) Como joven programador sin experiencia, me sorprendió que hubiéramos pagado tanto extra por un trabajo "profesional" y que esas personas ni siquiera se hubieran 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 fue denominada "YAPC 19100" en honor a este error tan frecuentemente reportado.

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

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

usar date.getFullYear().

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

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

¡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 del año 2000, uno podría haber tenido la tentación de corregir este error añadiendo "19" al resultado de getYear(), lo que daba como resultado 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!

Como se señaló, nunca debe 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 tratan estos días getYear() como getYear() se especificó originalmente para fechas anteriores al 2000, pero lo trataremos como getFullYear() para fechas posteriores al 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());

Es tonto.Él fechas anteriores al año 2000, y ahora solo devuelve el número de años desde 1900 por motivos heredados.Utilice getFullYear() para obtener el año real.

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

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

Como han dicho otros, devuelve el número de años desde 1900.La razón por la que lo hace eso es que cuando se inventó JavaScript a mediados de los 90, ese comportamiento era conveniente y consistente con las API de fecha y hora en otros lenguajes.En particular c.Y, por supuesto, una vez establecida la API, no podían cambiarla por razones de compatibilidad con versiones anteriores.

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

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

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top