Vamos a partir de un ejemplo sencillo y bastante común en javascipt, tenemos una fecha en formato texto de la que queremos sacar el día y pasarlo a número para poder sumar o restar días.
var fecha=»01/02/2011″;
var trozos=fecha.split(«/»);
console.debug(trozos[0]);
//Imprime 01
var dia=parseInt(trozos[0]);
console.debug(dia);
//Imprime 1
Parece que funciona bien, acabamos teniendo en día un 1 en número que podemos sumar y restar. Ponemos el programa a funcionar, hasta que un día salta por los aires en producción, o en el mejor de los casos en una batería de pruebas. Y sucede cuando el día de la fecha es ’08’ o ’09’:
var fecha=»08/02/2011″;
var trozos=fecha.split(«/»);
console.debug(trozos[0]); //Imprime 08
var dia=parseInt(trozos[0]);
console.debug(dia); //Imprime 0
Cuando compruebas que el error que te está volviendo loco viene de algo que dabas por supuesto que funcionaba bien es muy desconcertante.
La función pasrseInt funciona bien con 1, 14, 04, 37, ¿Por qué falla con 08 y 09? Y leyendo la documentación de javascript descubrimos que trata como octales los números que empiezan por 0. Así que de ’00’ a ’07’ funciona bien, pero no existe el ’08’ en octal, así que devuelve 0.
La solución es sencilla, parseInt admite un segundo parámetro para especificar la base. El código correcto sería:
var fecha=»08/02/2011″;
var trozos=fecha.split(«/»);
console.debug(trozos[0]); //Imprime 08
var dia=parseInt(trozos[0],10);
console.debug(dia); //Imprime 8
Recomiendo especificar la base siempre que uséis la función, sobre todo si es sobre algún dato que haya introducido el usuario, ya que nunca sabes si lo va a hacer poniendo el 0 delante o no.