El 29 de febrero de 2016 no existe
Quien se quedó sin trabajo el 29 de febrero de 2016 y quiere saber qué paro le tocaría no puede escribir esa fecha en el simulador del SEPE. El programa contesta «Error: Fecha no existente» y no le deja seguir. Si escribe el 29 de febrero de 2018, un día que no existió, lo da por bueno.
- Dominio
- sede.sepe.gob.es
- Guardado
- 31 AGO 2026
- Comprobado en vivo
- 15 SEP 2026
- Citas
- 8 en 4 ficheros guardados
- Lectura
- unos 4 min

La primera pantalla pide la fecha en dos casillas de texto, día y mes, y un desplegable de años que va de 2004 a 2026. Al pulsar “Continuar”, antes de que nada salga del navegador, se ejecuta una tanda de comprobaciones: que no haya huecos, que día y mes sean números, que la fecha exista, que no sea posterior a hoy y que no sea anterior al 1 de julio de 2004. Todas razonables. La tercera es la que se lleva esta pieza.

- Copia
- archivo
- Guardado
- 31 ago 2026
- Peso
- 31,1 kB
- sha256
- 87dc7f8f9a0a…
| 186 | <ul> |
| 187 | <li class="primerElemento"> <a href="/ |
| 188 | </ul> |
| 189 | </div> |
| 190 | <fieldset> |
| 191 | <legend>PREGUNTA 1</legend> |
| 192 | <div class="autocalcular"> |
| 193 | <p class=" |
| 194 | <p>Recuerde que si tiene un periodo de vacaciones retribuidas y no disfrutadas, por ejemplo 5 días, se entiende que la relación laboral finaliza cuando transcurre dicho periodo.</p> |
| 195 | |
| 196 | <SCRIPT type="text/javascript" src="/ |
| 197 | <SCRIPT type="text/javascript" src="/ |
| 198 | <SCRIPT type="text/javascript" src="/ |
| 199 | |
| 200 | |
| 201 | |
| 202 | <div class="camposEnColumna"> |
| 203 | <div class="camposEnLinea"> |
| 204 | <div class="camposEnBloque"> |
| 205 | <label for=" |
| 206 | <input name="diaFechaFinalizacion" id="diaFechaFinalizacion" type="text" class="inputEnLineaMini" style="width:1.3em" size="2" maxlength="2" value="" onkeyup=" |
| 207 | </div> |
| 208 | <div class="camposEnLinea"> |
Que la fecha exista se resuelve en veinte líneas. Para los meses de 31 y de 30 días basta con una lista. Para febrero, hasta el 28 siempre vale, y el 29 solo si el año es bisiesto. Para saber si un año es bisiesto hay otra función, y empieza partiendo el año en dos trozos: los caracteres 0 y 1 para el siglo, y del 3 al 5 para lo que el código llama década. Los programas cuentan las posiciones desde cero: en 2016, el carácter 0 es el 2 y el 3 es el 6. En un año de cuatro cifras, del 3 en adelante no cabe una década.
En 2016, los caracteres 0 y 1 son 20, que en efecto es el siglo. Pero del 3 al 5 solo queda el último dígito, el 6, porque no hay caracteres suficientes para la década. La función comprueba si 6 es múltiplo de cuatro, en vez de si lo es 16. Los años acabados en cero se escapan por otra rama, la que además exige que el siglo sea múltiplo de cuatro, y en el siglo XXI eso se cumple siempre. 20 entre 4 son 5 exactos.
- Copia
- archivo
- Guardado
- 31 ago 2026
- Peso
- 9,2 kB
- sha256
- a92ca416f30e…
| 83 | if(cadenaEncontrada != null) |
| 84 | return true; |
| 85 | return false; |
| 86 | } |
| 87 | |
| 88 | // |
| 89 | // Función que devuelve 'true' si un año es bisiesto |
| 90 | // |
| 91 | function compruebaBisiesto(Anno){ |
| 92 | |
| 93 | var siglo= parseInt(Anno. |
| 94 | var decada= parseInt(Anno. |
| 95 | |
| 96 | |
| 97 | if (decada%4==0){ |
| 98 | if(decada==0 && siglo%4==0) |
| 99 | return true; |
| 100 | else if (decada!=0) |
| 101 | return true; |
| 102 | } |
| 103 | return false; |
| 104 | } |
No lo dedujimos; lo ejecutamos, que para estas cosas es la única manera de no quedar en ridículo. Descargamos el fichero tal cual lo sirve la sede, lo cargamos en un Chrome 126 y llamamos a la función con los 23 años de su propio desplegable, sin tocar una coma. Da por bisiestos 2010, 2014 y 2018, que no lo fueron, y por años normales 2012 y 2016, que sí lo fueron. Acierta en 18 y falla en 5.
Con la comprobación de la fecha completa, el resultado es el que abre esta pieza. Preguntada por el 29 de febrero de cada uno de esos 23 años, acepta siete: 2004, 2008, 2010, 2014, 2018, 2020 y 2024. Tres de esos días no han existido nunca. Los dos 29 de febrero reales que faltan en la lista, 2012 y 2016, se rechazan con una ventanita del navegador: «Error: Fecha no existente». El mismo fichero trae el aviso traducido a euskera, catalán, gallego y valenciano. La fecha tampoco existe en esas cuatro lenguas.
- Copia
- archivo
- Guardado
- 31 ago 2026
- Peso
- 1,9 kB
- sha256
- b9edb8776da6…
| 16 | alert(obtener |
| 17 | enviar=false; |
| 18 | } |
| 19 | else if(!solo |
| 20 | !solo |
| 21 | { |
| 22 | alert(obtener |
| 23 | enviar=false; |
| 24 | } |
| 25 | else if (!test |
| 26 | { |
| 27 | alert(obtener |
| 28 | enviar=false; |
| 29 | } |
| 30 | else if (!fecha |
| 31 | { |
| 32 | alert(obtener |
| 33 | enviar=false; |
| 34 | } |
| 35 | else if (!fecha |
| 36 | { |
| 37 | alert(obtener |
| 38 | enviar=false; |
- Copia
- archivo
- Guardado
- 31 ago 2026
- Peso
- 8,4 kB
- sha256
- ccce7a6ef625…
| 61 | else if (codigo=="err14") literal="Os días cubertos teñen que ser os 180 esixidos."; |
| 62 | else if (codigo=="err15") literal="A porcentaxe da xornada traballada non pode ser superior ao 100%."; |
| 63 | |
| 64 | //subsidio |
| 65 | else if (codigo=="err11") literal="Sentímolo, non se pode facilitar a información, debido a que a situación que está consultando é posterior ao 30 de novembro deste ano, e non se pode ofrecer información a través deste medio mentres non se publiquen ofici… |
| 66 | else if (codigo=="err12") literal="O dato solicitado é necesario para facilitarlle a información sobre as condicións do seu subsidio. Se desexa continuar, é imprescindible que o cubra."; |
| 67 | else if (codigo=="err13") literal="Todos os campos deben ser numéricos."; |
| 68 | }else{ |
| 69 | if (codigo=="err01") literal="Error: El dato solicitado es necesario para facilitar la información sobre las condiciones de su prestación. Si desea continuar es imprescindible su cumplimentación."; |
| 70 | else if (codigo=="err02") literal="Error: El dato solicitado es necesario para facilitar la información sobre las condiciones de su prestación. Si desea continuar es imprescindible su cumplimentación."; |
| 71 | else if (codigo=="err03") literal="Error: Todos los campos deben ser numéricos."; |
| 72 | else if (codigo=="err04") literal="Error: Fecha no existente."; |
| 73 | else if (codigo=="err05") literal="Error: La fecha no debe ser superior a la actual."; |
| 74 | else if (codigo=="err06") literal="Error: La fecha debe ser superior o igual al 01/07/2004."; |
| 75 | else if (codigo=="err07") literal="Error: Al menos las 5 primeras filas deben de tener valor en todos sus campos."; |
| 76 | else if (codigo=="err08") literal="Error: Los campos de años deben estar entre los siguientes valores: "; |
| 77 | else if (codigo=="err09") literal="Error: Las fechas deben tomar un valor entre : "; |
| 78 | else if (codigo=="err10") literal="Error: No se pueden calcular datos para fechas posteriores a diciembre de "; |
| 79 | else if (codigo=="err14") literal="Los días cumplimentados tienen que ser los 180 exigidos."; |
| 80 | else if (codigo=="err15") literal="El porcentaje de la jornada trabajado no puede ser superior al 100%."; |
| 81 | //subsidio |
| 82 | else if (codigo=="err11") literal="Error: El dato solicitado es necesario para facilitar la información sobre las condiciones de su subsidio. Si desea continuar es imprescindible su cumplimentación."; |
| 83 | else if (codigo=="err12") literal="Error: El dato solicitado es necesario para facilitar la información sobre las condiciones de su subsidio. Si desea continuar es imprescindible su cumplimentación."; |
El resto del fichero explica de qué época viene todo esto. La función de la fecha empieza calculando el año del sistema con getYear, una orden de los tiempos de Netscape que devolvía los años transcurridos desde 1900, y lo corrige si sale menor que 200. Un comentario explica la diferencia entre Netscape e Internet Explorer. Luego esa variable no vuelve a aparecer en ninguna línea. Se arregla con esmero un dato que no se usa.
- Copia
- archivo
- Guardado
- 31 ago 2026
- Peso
- 9,2 kB
- sha256
- a92ca416f30e…
| 100 | else if (decada!=0) |
| 101 | return true; |
| 102 | } |
| 103 | return false; |
| 104 | } |
| 105 | |
| 106 | // |
| 107 | // Función que devuelve 'true' si una fecha es correcta |
| 108 | // |
| 109 | function testFecha(Anno,Mes,Dia){ |
| 110 | var hoy= new Date(); |
| 111 | var annoSys=hoy.getYear(); |
| 112 | //se hace la comprobacion siguiente porque en el IExplorer getYear devuelve el año completo |
| 113 | //mientras que en el Netscape devuelve los años desde el 1900 |
| 114 | |
| 115 | if(annoSys<200) |
| 116 | annoSys+=1900; |
| 117 | if(Mes.charAt(0) == '0') |
| 118 | Mes = Mes.charAt(1); |
| 119 | if(Dia.charAt(0) == '0') |
| 120 | Dia = Dia.charAt(1); |
| 121 | var dia= parseInt(Dia); |
| 122 | var mes= parseInt(Mes); |
La función que impide teclear letras en las casillas de números arranca comprobando que el navegador no sea Netscape 4, que salió en 1997 y dejó de actualizarse en 2002. La sede del paro sigue preguntándose cada vez si quien entra viene de allí. Debajo hay una cadena escrita a mano con todas las letras, los signos y las vocales acentuadas que hay que borrar, una por una. Entonces no había manera mejor de hacerlo, y a quien la escribió no se le olvidó ni la ñ.
- Copia
- archivo
- Guardado
- 31 ago 2026
- Peso
- 9,2 kB
- sha256
- a92ca416f30e…
| 155 | } |
| 156 | } |
| 157 | |
| 158 | return marcadoAlguno; |
| 159 | } |
| 160 | |
| 161 | // |
| 162 | //Función que sólo deja teclear numeros. |
| 163 | // |
| 164 | function quitaCaracteres(celda) |
| 165 | { |
| 166 | if (celda.value && !((navigator.appName == "Netscape") && (parse |
| 167 | { |
| 168 | var estado = false; |
| 169 | var cadenaNumero = celda.value; |
| 170 | var alphaCheck = " abcdefghijklmnñopqrstuvwxyz |
| 171 | alphaCheck = alphaCheck + "ºª\\!\"·$%&()=?¿¡'|@#¬/"; |
| 172 | alphaCheck = alphaCheck + "`^[*+]¨´{Ç}<>,.-_:;"; |
| 173 | alphaCheck = alphaCheck + "áéíóúÁÉÍÓÚäëïöüÄËÏÖÜàèìòùÀÈÌÒÙâêîôûÂÊÎÔÛ"; |
| 174 | |
| 175 | for (i=0; i<cadenaNumero.length; i++) |
| 176 | { |
| 177 | if (alphaCheck. |
Hay una tercera función, para saber si alguna opción de un grupo está marcada. En vez de preguntarle al formulario, arma un trozo de código como si fuera texto (el nombre del grupo, un corchete, un número) y se lo pasa a eval, la orden que coge una cadena y la ejecuta como si fuera programa. Todo manual la desaconseja desde hace veinte años. Aquí el texto lo escribe el propio fichero y no el visitante, así que no lleva a ninguna parte. Es la manera en que se hacían las cosas.
- Copia
- archivo
- Guardado
- 31 ago 2026
- Peso
- 9,2 kB
- sha256
- a92ca416f30e…
| 141 | // |
| 142 | //Función que devuelve si existe un radio de un grupo seleccionado. |
| 143 | // cadena: nombre del grupo |
| 144 | // numeroRadios: nº de radios del grupo |
| 145 | // |
| 146 | function marcado |
| 147 | { |
| 148 | var marcadoAlguno=false; |
| 149 | for (i=0;i<numeroRadios;i++) |
| 150 | { |
| 151 | if (eval(""+cadena+"[" |
| 152 | { |
| 153 | marcadoAlguno=true; |
| 154 | break; |
| 155 | } |
| 156 | } |
| 157 | |
| 158 | return marcadoAlguno; |
| 159 | } |
| 160 | |
| 161 | // |
| 162 | //Función que sólo deja teclear numeros. |
Al final, después de la última llave, hay cuarenta líneas entre comentarios: una función para leer cookies, las notas que el navegador guarda de cada sitio, que alguien depuró a base de ventanas emergentes. «ENTRO», «WHILE», el contenido de la cookie, el índice del bucle, todo a golpe de aviso en pantalla. El último aviso anuncia que sale de la función y está escrito después del return, así que no se habría visto jamás. El 23 de septiembre de 2026 la sede seguía sirviendo el mismo fichero, idéntico byte a byte al que guardamos el 31 de agosto. El servidor dice que no se toca desde el 6 de marzo de 2020.
- Copia
- archivo
- Guardado
- 31 ago 2026
- Peso
- 9,2 kB
- sha256
- a92ca416f30e…
| 283 | alert("entro?¿?"); |
| 284 | return getcookieval (j); |
| 285 | } |
| 286 | alert(document. |
| 287 | i = document.cookie.indexOf(" ",i) + 1; |
| 288 | |
| 289 | alert("i"+i); |
| 290 | if (i==0) break; |
| 291 | alert("WHILE"); |
| 292 | } |
| 293 | return null; |
| 294 | alert("salgo"); |
| 295 | }*/ |
El 29 de febrero de 2016 existió. Quien perdió el trabajo ese día no puede escribirlo aquí.
- En el simulador de prestaciones del SEPE, la función que decide si un año es bisiesto toma los caracteres del 3 al 5 del año de cuatro cifras, que es solo el último dígito.
- Ejecutada tal cual sobre los 23 años de su propio desplegable, acierta en 18 y falla en 5: 2010, 2012, 2014, 2016 y 2018.
- La comprobación de la fecha completa acepta el 29 de febrero en 2004, 2008, 2010, 2014, 2018, 2020 y 2024, y lo rechaza en 2012 y 2016 con el aviso «Error: Fecha no existente».
- No hemos enviado ningún formulario ni hemos pedido ningún cálculo al SEPE: descargamos el fichero de funciones que la sede sirve a cualquiera y llamamos a sus funciones en nuestro propio navegador.
- No decimos, por tanto, qué hace el servidor con una fecha que el navegador deja pasar, ni si la vuelve a comprobar.
- No decimos nada sobre el cálculo de la prestación, que no hemos mirado.
- Y no decimos que a nadie le haya pasado: decimos lo que esta función responde cuando se la llama.
De dónde sale cada cita
Cada trozo de código de esta ficha está en un fichero guardado tal como lo entregó el servidor, con su huella (sha256) y su hora. Las citas entre «» se comprueban por programa contra ese fichero antes de publicar.
- https://sede.sepe.gob.es/dgsimulador/introSimSimuladorPregunta1.do31 de agosto de 2026, 16:22archivosha256 87dc7f8f9a0a94ae47630e36d60fdd794a2dbfe613d33d3150dc9fc3c95fc5d8
- https://sede.sepe.gob.es/dgsimulador/recursos/js/SimFunciones.js31 de agosto de 2026, 16:22archivosha256 a92ca416f30e74f8cf74a58026b85301c67ed7e62dedd13c0bec729a12773118
- https://sede.sepe.gob.es/dgsimulador/recursos/js/SimFunciones.js15 de septiembre de 2026, 02:01en vivo · byte a byte igualsha256 a92ca416f30e74f8cf74a58026b85301c67ed7e62dedd13c0bec729a12773118
- https://sede.sepe.gob.es/dgsimulador/recursos/js/SimValidadorPregunta1.js31 de agosto de 2026, 16:22archivosha256 b9edb8776da645d2fdfe3bc88a5f3b8867f2192c4b812e8c8edc557fc63d7122
- https://sede.sepe.gob.es/dgsimulador/recursos/js/SimMensajes.js31 de agosto de 2026, 16:22archivosha256 ccce7a6ef625135ba1c50512a530bb5512de9624303a4edbe5d55c35212134ce
- https://sede.sepe.gob.es/dgsimulador/recursos/js/SimMensajes.js15 de septiembre de 2026, 02:01en vivo · byte a byte igualsha256 ccce7a6ef625135ba1c50512a530bb5512de9624303a4edbe5d55c35212134ce