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?
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
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.
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 00
en 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.
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());
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