Pieza 1 de 64
TiempoPieza nº 0001 de 64

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
Captura de https://sede.sepe.gob.es/
foto 1La portada de sede.sepe.gob.es el 26 de septiembre de 2026: la sede electrónica del Servicio Público de Empleo Estatal, con sus dos entradas, personas y empresas.Captura del 26 de septiembre de 2026, 16:51 (hora peninsular)

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.

Captura de https://sede.sepe.gob.es/dgsimulador/introSimSimuladorPregunta1.do
foto 2La primera pregunta del simulador, la fecha en que terminó el último contrato, tal como carga: no se escribió ni se pulsó nada. Recuadrado, el desplegable de años, con 23 opciones de 2004 a 2026; las dos casillas de la izquierda son el día y el mes.Captura del 23 de septiembre de 2026, 14:18 (hora peninsular) · el recuadro es nuestro
1de 8sede.sepe.gob.es/dgsimulador/introSimSimuladorPregunta1.dolínea 197 de 333
Copia
archivo
Guardado
31 ago 2026
Peso
31,1 kB
sha256
87dc7f8f9a0a…
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="/dgsimulador/recursos/js/SimValidadorPregunta1.js"></SCRIPT>
197<SCRIPT type="text/javascript" src="/dgsimulador/recursos/js/SimFunciones.js"></SCRIPT>
198<SCRIPT type="text/javascript" src="/dgsimulador/recursos/js/SimMensajes.js"></SCRIPT>
1La primera pantalla del simulador carga el fichero de funciones. La etiqueta va en mayúsculas, como se escribía cuando el HTML no distinguía.

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.

2de 8sede.sepe.gob.es/dgsimulador/recursos/js/SimFunciones.jslínea 94 de 296
Copia
archivo
Guardado
31 ago 2026
Peso
9,2 kB
sha256
a92ca416f30e…
91function compruebaBisiesto(Anno){
92
93        var siglo= parseInt(Anno.substring(0,2));
94        var decada= parseInt(Anno.substring(3,5));
95        
96        
97        if (decada%4==0){
2La función entera. El siglo se toma de los caracteres 0 y 1; la “década”, del 3 al 5. En un año de cuatro cifras, del 3 al 5 solo hay un carácter: el último.

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.

3de 8sede.sepe.gob.es/dgsimulador/recursos/js/SimValidadorPregunta1.jslínea 27 de 48
Copia
archivo
Guardado
31 ago 2026
Peso
1,9 kB
sha256
b9edb8776da6…
24}
25else if (!testFecha(document.formulario.annoFechaFinalizacion.value,document.formulario.mesFechaFinalizacion.value,document.formulario.diaFechaFinalizacion.value))
26{
27    alert(obtenerLiteral("err04"));
28    enviar=false;
29}
30else if (!fechaMenorIgualActual(document.formulario.annoFechaFinalizacion.value,document.formulario.mesFechaFinalizacion.value,document.formulario.diaFechaFinalizacion.value))
3El validador de la primera pregunta: si la fecha no pasa la prueba, sale el aviso 04 y el formulario no se envía.
4de 8sede.sepe.gob.es/dgsimulador/recursos/js/SimMensajes.jslínea 72 de 94
Copia
archivo
Guardado
31 ago 2026
Peso
8,4 kB
sha256
ccce7a6ef625…
69if (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.";
70else 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.";
71else if (codigo=="err03") literal="Error: Todos los campos deben ser numéricos.";
72else if (codigo=="err04") literal="Error: Fecha no existente.";
73else if (codigo=="err05") literal="Error: La fecha no debe ser superior a la actual.";
74else if (codigo=="err06") literal="Error: La fecha debe ser superior o igual al 01/07/2004.";
75else if (codigo=="err07") literal="Error: Al menos las 5 primeras filas deben de tener valor en todos sus campos.";
4El texto del aviso 04 en castellano. El mismo fichero lo tiene en euskera, catalán, gallego y valenciano.

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.

5de 8sede.sepe.gob.es/dgsimulador/recursos/js/SimFunciones.jslínea 111 de 296
Copia
archivo
Guardado
31 ago 2026
Peso
9,2 kB
sha256
a92ca416f30e…
108//------------------------------------------------------------------------------------------------
109function 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
5El arranque de la función de la fecha: un arreglo para la diferencia entre Internet Explorer y Netscape, sobre una variable que después no vuelve a aparecer.

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 ñ.

6de 8sede.sepe.gob.es/dgsimulador/recursos/js/SimFunciones.jslínea 166 de 296
Copia
archivo
Guardado
31 ago 2026
Peso
9,2 kB
sha256
a92ca416f30e…
163//------------------------------------------------------------------------------------------------
164function quitaCaracteres(celda)
165{
166    if (celda.value && !((navigator.appName == "Netscape") && (parseInt(navigator.appVersion) == 4)))
167    {
168        var estado = false;
169        var cadenaNumero = celda.value;
6La excepción para Netscape 4, que se dejó de actualizar en 2002.

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.

7de 8sede.sepe.gob.es/dgsimulador/recursos/js/SimFunciones.jslínea 151 de 296
Copia
archivo
Guardado
31 ago 2026
Peso
9,2 kB
sha256
a92ca416f30e…
148var marcadoAlguno=false;
149for (i=0;i<numeroRadios;i++)
150{
151  if (eval(""+cadena+"["+i+"].checked")==true)
152  {
153    marcadoAlguno=true;
154    break;
7El nombre del grupo de opciones llega como texto y se convierte en código con eval para leerlo.

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.

8de 8sede.sepe.gob.es/dgsimulador/recursos/js/SimFunciones.jslínea 294 de 296
Copia
archivo
Guardado
31 ago 2026
Peso
9,2 kB
sha256
a92ca416f30e…
291        alert("WHILE");
292    }
293    return null;
294    alert("salgo");
295}*/
8El final del bloque comentado: el último aviso está después del return, así que no habría llegado a verse nunca.

El 29 de febrero de 2016 existió. Quien perdió el trabajo ese día no puede escribirlo aquí.

Lo que decimos
  • 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».
Lo que no decimos
  • 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.
Procedencia

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.

Desgobierno Digital · https://desgobiernodigital.com/piezas/sepe-bisiesto/ · copia impresa de la edición generada el 19 de octubre de 2026 · Un proyecto de BQuant · correcciones: @Gsnchez