Dos maneras de mover un reloj
Abre la página «Hora oficial» de la sede de la Diputación de Jaén y verás un reloj que avanza. Avanza leyéndose a sí mismo: cada segundo mira la hora pintada en pantalla y le suma uno. En la sede del Ministerio de Transportes el reloj hace lo contrario: para la página entera para preguntar la hora al servidor, tres veces por minuto. Las dos rutinas se llaman igual.
- Dominios
- sede.dipujaen.es · sede.transportes.gob.es
- Guardado
- 31 AGO 2026
- Comprobado en vivo
- 14 SEP 2026
- Citas
- 7 en 3 ficheros guardados
- Lectura
- unos 4 min

Es la pieza que más nos gusta enseñar de todo el museo: dos sedes, el mismo problema, dos soluciones contrarias y ninguna buena. Y encima riman. Empecemos en Jaén. La sede electrónica de la Diputación tiene una página titulada «Hora oficial». Es una página seria: dice que esa hora se sincroniza con el Real Observatorio de la Armada, que guarda la hora oficial de España, y cita dos artículos de la Ley 39/2015.

Y advierte, en una frase para enmarcar: «Para cualquier trámite, la fecha y hora oficial de la Sede Electrónica es la única que tendrá validez legal y no la del equipo desde el que se realice el trámite.» Debajo, un reloj con fecha, hora, minutos y segundos, avanzando. Nos preguntamos cómo avanzaba. Es una pregunta rara para hacerle a un reloj, pero es a lo que nos dedicamos.
La respuesta cabe en treinta líneas: cada segundo, el programa mira el texto pintado en la pantalla, «21:31:49», por ejemplo, lo parte por los dos puntos, le suma uno al último trozo, se ocupa de que 59 pase a 00 y lo vuelve a pintar. No le pregunta la hora al servidor. Al Observatorio, tampoco. Ni siquiera al reloj del propio ordenador, que lo tiene al lado. Sabe qué hora es porque acaba de leerla en su propia cara.
- Copia
- archivo
- Guardado
- 31 ago 2026
- Peso
- 27,4 kB
- sha256
- 4761bdfe7b4b…
| 370 | </div> |
| 371 | </div> |
| 372 | |
| 373 | <script> |
| 374 | |
| 375 | $(document).ready(function () { |
| 376 | mueveReloj(); |
| 377 | |
| 378 | }); |
| 379 | |
| 380 | function mueveReloj() { |
| 381 | var mensaje = document. |
| 382 | |
| 383 | hora = parseInt(mensaje[0]); |
| 384 | minuto = parseInt(mensaje[1]); |
| 385 | segundos = parseInt(mensaje[2]); |
| 386 | |
| 387 | segundos++;2 |
| 388 | |
| 389 | if (segundos == 60) { |
| 390 | segundos = 0; |
| 391 | minuto++; |
| 392 | if (minuto == 60) { |
| 393 | minuto = 0; |
| 394 | hora++; |
| 395 | if (hora == 24) { |
| 396 | hora = 0; |
| 397 | } |
| 398 | } |
Funciona, si a eso se le llama funcionar. La hora que se ve al abrir la página es la buena: la ha escrito el servidor. Después, el reloj se cuenta los segundos a sí mismo, con la única promesa que hace un navegador cuando se le pide que vuelva dentro de un segundo: nunca antes. Si tarda, el reloj no se entera; suma su segundo y sigue. Un reloj así solo puede atrasar, y atrasa más cuanto más tiempo lleve la página abierta.
- Copia
- archivo
- Guardado
- 31 ago 2026
- Peso
- 27,4 kB
- sha256
- 4761bdfe7b4b…
| 396 | hora = 0; |
| 397 | } |
| 398 | } |
| 399 | } |
| 400 | |
| 401 | if (hora < 10) { hora = '0' + hora } |
| 402 | if (minuto < 10) { minuto = '0' + minuto } |
| 403 | if (segundos < 10) { segundos = '0' + segundos } |
| 404 | |
| 405 | document. |
| 406 | |
| 407 | setTimeout(mueveReloj, 1000); |
| 408 | } |
| 409 | </script> |
| 410 | </div> |
| 411 | |
| 412 | <div class="container" style="margin-top:-10px;"> |
| 413 | |
| 414 | <div class="row clearfix"> |
| 415 | <div id="footer" class="col-lg-12 col-md-12 col-sm-12 col-xs-12"> |
| 416 | <div class="col-lg-2 col-md-2 col-sm-12 col-xs-12 text-center" |
| 417 | style="background: white; padding-top: 5px; padding-bottom: 5px; border-top: 2px solid #658024;"> |
| 418 | <img src="/ |
La fecha, además, no la toca nadie: después de las 23:59:59 vienen las 00:00:00 del mismo día. Y tres párrafos por encima, en la misma pantalla, sigue la frase de que la única hora válida es la de la sede y no la del equipo desde el que se realice el trámite. Lo que se enseña bajo ese rótulo, a partir del segundo siguiente, lo cuenta el equipo desde el que se realiza el trámite.
La solución evidente es preguntarle la hora al servidor de vez en cuando. En la sede del Ministerio de Transportes lo pensaron, y lo hicieron. Con entusiasmo. Esa sede, antes sede.mitma.gob.es y hoy sede.transportes.gob.es, también tiene su página de la hora. Se titula «Fecha y hora oficial de la Sede», cita una ley de 2007 sustituida en 2015 y habla en nombre del «Ministerio de Fomento», que ya no se llama así. Y tiene una frase en negrita justo encima del reloj.

La frase dice: «La fecha y hora oficial es proporcionada por la Sede en el momento de la carga de la página. Pulse 'Actualizar' cuando necesite tener certeza de la misma con precisión de segundos.» Es, palabra por palabra, la descripción del reloj de Jaén. Solo que debajo no está el reloj de Jaén. Debajo hay un reloj que recibe la hora escrita en la página, la tira y vuelve a pedírsela al servidor.
- Copia
- en vivo
- Leído
- 14 sep 2026
- Peso
- 15,0 kB
- sha256
- 31af0233c703…
| 77 | <p id=" |
| 78 | Por último, el artículo 15.2 del <a href=" |
| 79 | target="_blank" title="Abrir archivo 'Real Decreto 4/2010 de 8 de enero, por el que...'. Enlace a archivo con extensión .pdf. Este enlace abre una ventana nueva"> |
| 80 | Real Decreto 4/2010, de 8 de enero</a>, por el que se regula el Esquema Nacional |
| 81 | de Interoperabilidad en el ámbito de la Administración Electrónica, indica que “la sincronización de la fecha y la hora se realizará con el Real Instituto y Observatorio de la Armada, de conformidad con lo previsto sobre la hora legal en el Real Decre… |
| 82 | </p> |
| 83 | <p id=" |
| 84 | En cumplimiento de estas disposiciones se ofrece la fecha y hora oficial de la Sede |
| 85 | Electrónica del Ministerio de Fomento. |
| 86 | </p> |
| 87 | <p id=" |
| 88 | <strong>La fecha y hora oficial es proporcionada por la Sede en el momento de la carga de la página. Pulse 'Actualizar' cuando necesite tener certeza de la misma con precisión de segundos.</strong> |
| 89 | </p> |
| 90 | <div class=" |
| 91 | <div class=" |
| 92 | <div class=" |
| 93 | <script type="text/javascript"> |
| 94 | mueve |
| 95 | </script> |
| 96 | </div> |
| 97 | </div> |
| 98 | <div id=" |
| 99 | <p id=" |
Luego suma un segundo por vuelta, como el de Jaén, y cada veinte vueltas vuelve a preguntar. La pega está en una palabra de la línea que pregunta: false. En el idioma de los navegadores significa espera aquí hasta que contesten, y quien espera es la página entera, sin atender clics ni teclas. Desde donde lo hemos medido, un cuarto de segundo, tres veces por minuto.
Un reloj que detiene la sede para consultar la hora, que viene a ser lo contrario de para lo que sirve un reloj. El mismo reloj va en la cabecera de dos aplicaciones de esa sede, la de autorizaciones de transporte y la del tacógrafo, junto a un enlace que dice «Ver hora oficial de la Sede». Y ahí descubrimos para qué sirve tirar la hora y volver a pedirla: la que el servidor escribe en esas páginas llega vieja.
- Copia
- archivo
- Guardado
- 31 ago 2026
- Peso
- 47,8 kB
- sha256
- 1c44e72516b3…
| 69 | return objXMLHttp; |
| 70 | } |
| 71 | function crearCapa(id,clase) { |
| 72 | var elem = document. |
| 73 | elem.id = id; |
| 74 | elem.className = clase; |
| 75 | return elem; |
| 76 | } |
| 77 | |
| 78 | function obtenerFechaServidor(){ |
| 79 | try{ |
| 80 | xmlHttp. |
| 81 | xmlHttp.send(null); |
| 82 | if(xmlHttp.status=="200"){ |
| 83 | var respuesta= |
| 84 | var v=respuesta.split("#"); |
| 85 | var fecha=new Date(v[0], |
| 86 | return fecha; |
| 87 | }else{ |
| 88 | return globalFecha1; |
| 89 | } |
| 90 | |
| 91 | }catch(err){ |
| 92 | //si se produce un error al recuperar la fecha lo que hago es |
| 93 | return globalFecha1; |
| 94 | } |
| 95 | } |
| 96 | |
| 97 | function pintar |
| 98 | tickCounter=tickCounter + 1; |
| 99 | pintar |
| 100 | pintar |
| 101 | |
| 102 | //aquí miro si puedo sincronizar con el servidor cada x segundos |
| 103 | if(tickCounter>=20){ |
| 104 | tickCounter=0; |
| 105 | globalFecha1= |
| 106 | } |
| 107 | globalFecha1. |
| 108 | // |
| 109 | } |
| 110 | |
| 111 | function pintarFecha(fecha, idCapa) { |
| 112 | var capa = document. |
| 113 | if (capa != null) { |
| 114 | capa.innerHTML = dosDigitos(fecha.getDate()) + "/" + dosDigitos(fecha. |
El 31 de agosto, a las cinco de la tarde, la de autorizaciones decía que eran las tres y media. El 26 de septiembre, a las tres y veinte de la tarde, decía las cinco y media de esa madrugada, y la del tacógrafo, lo mismo. No se nota, porque el programa la tira y pregunta, y la pregunta sí contesta la hora buena. El paso que sobraba es el que la salva. Y luego está lo que el fichero cuenta de quien lo escribió.
Una rutina es un trozo de programa con nombre propio, y el nombre lo elige quien lo escribe. La de Jaén y la del Ministerio se llaman igual: mueveReloj. Dos sedes distintas, el mismo nombre para el mismo encargo y dos soluciones opuestas. Una no vuelve a preguntarle la hora a nadie. La otra la pregunta a costa de dejar la página quieta. Cien líneas más abajo del reloj del Ministerio, otro comentario deja constancia de un apaño: «temporal hasta que». Ahí se acaba la frase, en mitad de un fichero que la sede seguía sirviendo, idéntico, el 23 de septiembre.
- Copia
- archivo
- Guardado
- 31 ago 2026
- Peso
- 47,8 kB
- sha256
- 1c44e72516b3…
| 129 | if (valor < 10) { |
| 130 | return "0" + valor; |
| 131 | } else { |
| 132 | return valor; |
| 133 | } |
| 134 | } |
| 135 | |
| 136 | function getHtml |
| 137 | var titlemod=new String(title); |
| 138 | var pos= |
| 139 | if (pos>-1){ |
| 140 | title= |
| 141 | } |
| 142 | var cadena="<div class=\"imprimir\"><a href= |
| 143 | cadena= cadena + "title=\"" + title + "\">" + texto + "</a><noscript>script deshabilitado</noscript> |
| 144 | document.write(cadena); |
| 145 | //return cadena; |
| 146 | //return cadena; |
| 147 | } |
| 148 | function getHtml |
| 149 | var cadena="<a href= |
| 150 | cadena= cadena + texto + "</a>"; |
| 151 | document.write(cadena); |
En Jaén la hora es correcta en el momento en que se abre la página. Es también la última vez que se comprueba.
- En sede.dipujaen.es/Hora el reloj avanza leyendo el texto que él mismo ha pintado, sin volver a consultar al servidor ni al reloj del ordenador, y la fecha no cambia nunca.
- En sede.transportes.gob.es (la antigua sede.mitma.gob.es) la página «Fecha y hora oficial de la Sede» y las cabeceras de dos aplicaciones mueven el reloj con una petición que deja la página en suspenso, al arrancar y cada veinte segundos.
- La hora que el servidor escribe en esas cabeceras llegó vieja cada vez que la miramos: el 31 de agosto a las 17:05 decía 15:30:41, y el 26 de septiembre a las 15:21 decía 05:33:39 y 05:35:47 de ese mismo día (copias guardadas ese día).
- Las dos rutinas se llaman
mueveReloj. - El 23 de septiembre de 2026 la página de Jaén trae el mismo código y el fichero del Ministerio es idéntico al del 31 de agosto.
- Que ninguna solicitud se haya presentado fuera de plazo por esto: no lo sabemos y no se ve desde fuera.
- Tampoco que la hora de Jaén esté mal: al abrir la página es correcta, la pone el servidor; lo que falla es todo lo que viene después del primer segundo.
- Ni que el servidor de Jaén no esté sincronizado con el Observatorio: puede que lo esté; lo que no está sincronizado con nada es el número que usted ve.
- Ni cuánto dura la pausa del Ministerio en su ordenador: depende de su red; nosotros medimos un cuarto de segundo desde la nuestra.
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.dipujaen.es/Hora31 de agosto de 2026, 21:31archivosha256 4761bdfe7b4b4ce2395f26daaf1592bd2df674dd236ed8f9398f6859d6ff8fcb
- https://sede.transportes.gob.es/MFOM.FechaHora/14 de septiembre de 2026, 13:13en vivosha256 31af0233c703132ef00aebb1c54926760b87697f30f51dcf46b4eb8371b23a6a
- https://sede.transportes.gob.es/MFOMWeb/r/js/mfom.js31 de agosto de 2026, 17:05archivosha256 1c44e72516b3e5cc5f4e2ec52d8ed0f79d62087388811b4a3586cb45ae2cb4ef