2012-03-07 24 views
5

Esta mañana noté un problema peculiar con el método JavaScript setFullYear.JavaScript setFullYear() Método Devolver una fecha incorrecta

Cuando se utiliza el método de este modo: se devuelve

d.setFullYear(2012,2,8); 

El valor correcto:

Thu Mar 08 2012 10:30:04 GMT+0000 (GMT Standard Time) 

Sin embargo si uso el método parseInt para devolver los números enteros, la fecha devuelta es incorrecto:

d.setFullYear(parseInt("2012"), parseInt("02"), parseInt("08")); 

devuelve:

Wed Feb 29 2012 10:31:30 GMT+0000 (GMT Standard Time) 

Parece que el método parseInt está devolviendo los valores incorrectos, pero cuando lo prueba:

document.write(parseInt("2"));

A continuación, se devuelve el valor correcto (2)

un violín funcionamiento está aquí : http://jsfiddle.net/rXByJ/

¿El problema está en parseInt o con setFullYear?

+1

Muy buena pregunta. ¡Qué trampa! – PiTheNumber

Respuesta

9

El problema es que parseInt('08') es 0. Esto funciona:

d.setFullYear(parseInt("2012"), parseInt("02"), 8); 

Tanto parseInt (08 ') y parseInt ('09') devolverá cero porque la función trata de determinar la base correcta para el sistema numérico utilizado . En los números de Javascript que comienzan con cero se consideran octal y no hay 08 o 09 en octal, de ahí el problema.

http://www.ventanazul.com/webzine/articles/issues-parseint-javascript

solución es usar el segundo parámetro:

parseInt('08', 10) 

O

Number('08') 

Véase también How do I work around JavaScript's parseInt octal behavior?

+1

El número necesita citas alrededor del 08. Tenga cuidado, el número ('08 .789 ') producirá 8.789 como resultado. Si realmente quieres un número entero, no uses el número –

+0

Brilliant! No pensé que el parseInt ("8") y el parseInt ("08") pudieran ser diferentes, pero luego no me encuentro con las bases octales todos los días ... –

1

si eso es cierto parseInt (08') devolverá 0 en lugar de 8 porque toma 08 como número octal y lo convierte en 0 por lo que debe usar parseInt ('08 ', 10) donde el segundo parámetro especifica base para la conversión, es decir 10 para decimal

así que en resumen siempre especifique la base al usar parseInt :)

2

Este post here en stackOverflow tiene una explicación muy detallada sobre por qué hay que usar parseInt con un base o radix

0

Si estás bien con la función primordial Date.prototype.setFullYear() modo que le proporcione una fecha objeto en lugar de milisegundos puede hacer esto.

Date.prototype.setFullYear = (function(ref){ 
    return function(val){ 
     return new Date(ref.bind(this)(val)); 
    } 
})(Date.prototype.setFullYear) 
Cuestiones relacionadas