Tarde o temprano, todo programador tiene que tratar con los husos horarios.
Y no puedo aconsejarles mucho aquí. Pero puedo prevenirlos.
Puedo decirles por qué nunca, nunca deberían tratar con husos horarios si pueden evitarlo.
Imaginemos que alguien ha creado una aplicación
que te permite calcular cuantos segundos atras algo ocurrio en el pasado.
Escribes la fecha y la hora, y te devuelve el número de segundos.
Y la gente miran la aplicación y piensa "OK, eso puede servirme...."
"Pero añadámosle una pequeña caja que permita cambiar el huso horario"
Entonces, si estás comparando entre ahora en Nueva York y hace cinco días en Londres, puedes saber cuanto es.
Y eso está bien. Una pequeña pestaña te deja cambiar a que hora estás delante o detrás de Greenwich.
Estupendo.
Tarde o temprano, después de que se popularice, reciben una llamada de Australia.
Y Australia dirá "Bueno' día ami--"
-- No voy a intentar imitar acentos,
Simplemente no debería hacerlo.
Australia dirá "¡Hola!"
"Por cierto, nosotros estamos nueve horas y media por delante de Greenwich"
Y el programador dirá "¿En serio?"
"Por supuesto, nueve horas y media"
"OK, añadiré una excepción para ti. Está bien."
Un poco más tarde, alguien llama desde Nepal.
Y dirán "Hola. Estamos cinco horas y cuarto adelante de Greenwich"
Y ellos dirán "¿De verdad?" "Sí, ¡hemos estado así años! Sí, ¡cinco horas y media!"
Vale. Perfecto. Y ellos lo pondrán en otra excepción. Y quizás ellos busquen
en la lista de husos horarios. Esa lista perfecta que te dice
que es cada cosa, y que te asegura que has cubierto cada huso horario en el mundo.
Entonces llega el otoño.
Y reciben una llamada desde Inglaterra.
E Inglaterra dirá "Perdone. Eh, nosotros estamos una hora por detrás en este momento, ¿qué está pasando?"
"Un segundo, ¡los relojes acaban de cambiar!"
"Está bien -no, ya hemos tratado ese asunto"
"Pusimos un aviso cuando llega el cambio de horario, ¡y lo pusimos ya!"
E Inglaterra dirá "No, nosotros nos cambiamos al ahorro de luz una semana antes"
"Es diferente dependiendo de donde vivas"
"Nosotros atrasamos los relojes una semana antes que tú"
Y en ese preciso instante
generalmente el programador se llevará las manos a la cabeza
y se dará cuenta de donde se ha metido.
¡Y está bien! Lo implementarán
y podrán tratar cada país cuando cambien al horario de ahorro de energía aunque sea otro día distinto.
Mirarán al archivo que les dice como hacerlo y lo copiarán en su aplicación.
Entonces recibirán una llamada de alguien desde el hemisferio sur que le dirá
"Sí, nosotros no atrasamos una hora en Otoño, la adelantamos"
"Nuestra primavera... es en Noviembre"
Y en ese momento comenzarán a mirar con nostalgia intoxicante preferido
y cuestionarse si deberían tomarse un trago antes de seguir adelante...
... y lo pondrán en el programa también.
Entonces reciben una llamada desde Samoa.
En el Pacífico, junto a la línea internacional del cambio de fecha.
Y Samoa dirá "¡Hola!"
"Sí, nos saltamos un día el año pasado"
Y el programador dirá "¿Qué?"
"Sí, nos saltamos un día. Pasamos del 29 de diciembre de 2011 al 31 de diciembre"
"Nos cambiamos de un lado de la línea internacional del cambio de fecha, estando horas y horas detrás de Greenwich ...
... para estar horas y horas delante de Greenwich. Nos ayuda con el comercio con Australia."
"¿Podrías tenerlo en cuenta cuando intentes averiguar cuantos días han pasado, y en cuantos segundos las cosas ocurrieron en el pasado?!
[respira profundamente] Está bien, hay un archivo que te indica cuando algún país ha cambiado su huso horario.
Y resulta que es algo que ocurre bastante a menudo.
Pero estas cosas se anuncian con anticipacion, asi que siempre y cuando tengamos ese archivo actualizado
y codificarlo en la lógica del programa, estará bien.
Luego, cuando miras atrás, te das cuenta que durante la Segunda Guerra Mundial,
Inglaterra tenía doble horario de verano.
Se fueron completamente hacia el horario de verano inglés y añadieron una hora extra.
Por lo que estaban dos horas por delante de Greenwich, a pesar de... tener a Greenwich.
No pasa nada, trataremos con ello.
¿Te has dado cuenta de que he empezado a hablar como si fueramos tú o yo?
Es porque ya he hecho esto antes, y es verdaderamente frustrante.
Y te aseguras de apuntarlo en la lista
de cuando los países van a cambiar sus husos horarios - ¡que aparentemente ocurre muchas veces!
Como, a veces, bastantes veces en un año porque los gobiernos cambian.
Y entonces este mítico programador recibe una llamada desde Libia.
qué en 2013, solo con unos pocos días de antelación, decidieron que no iban a atrasar los relojes.
Con tan poca antelación que no fue posible para nadie tener la actualizacion a tiempo
Significando que cualquier ordenador libio, no importando que sistema operativo tuviese...
... estaba una hora por detrás.
Está bien, lees el artículo del periódico que que informa de ello y rápidamente lo pones en el programa también.
Entonces, entonces recibes una llamada desde Cisjordania.
Dónde la población israelí está utiliza una hora distinta a la población palestina.
Porque uno sigue a Israel y el otro no.
Y ahora tiene dos poblaciones en el mismo lugar que están siguiendo horas distintas.
Y ahora tienen que preguntarse a sí mismos si están en un huso horario o en otro, dependiendo de quienes son y de donde están.
¡Y no hay manera de codificar eso en tu programa! Entonces...
Entonces recibes una llamada desde el Museo Histórico.
Alguien dice "Vale, estoy intentando calcular algunas fechas atrás en el siglo XVIII"
"Y hemos cambiado del calendario Juliano al Gregoriano"
"Y no es el hecho de que hayamos perdido cerca de tres semanas...
... es que hemos saltado desde esta fecha hasta esta, perdiendo las intermedias."
"¿Podrías codificarlo de manera de que me funcione a mi?"
No pasa nada porque alguien ya te había dicho cuando fueron esas fechas,
y tu puedes simplemente implementarlo de la misma manera en la lógica de tu programa
pero ahora parece muy largo y realmente complicado
y este líoso enredo de código con forma de spagueti de alguna manera funciona
¡y entonces recibes una llamada desde el Museo de Historia de Rusia!
Que dice "Sí, nosotros nos hemos cambiado al calendario gregoriano en el siglo XX ...
... y nos damos cuenta de que las fechas que has saltado cambian dependiendo de donde te encontrabas...
... y, ¿podrías tratar con eso también?" ¡Y entonces recibes una llamada desde el Museo de Historia Británico!
Que dice que hasta, creo que fue el siglo XVI ...
¡el año empezaba el 25 de marzo!
Simplemente te explotó la cabeza ahí.
Desde el 24 de marzo de 924
y entonces será el 25 de marzo de 925. Y es simplemente el día siguiente.
Porque has ido desde el 31 de diciembre de 924 hasta el 1 de enero de 924, ¡porque va en ese orden!
Y es enormemente complicado, Y ENTONCES...
Recibes la llamada del astrofísico...
Que dice "Por cierto, ¡acabamos de tener un segundo adicional!"
Y en este punto, solamente puedes decir " ... ¡¿Qué?!"
Segundos adicionales; porque la Tierra no gira a una velocidad constante.
Se frena, acelera, conforme se mueven las placas tectónicas
y el campo magnético cambia, o algo así. Y ocasionalmente
la Unión Astronómica Internacional cuadrará porqué necesitamos un segundo adicional.
Si lo haces, los relojes van 23:59:58
y entonces llegan al 23:59:59
y entonces, en vez de ir [00:00:00] como cualquier hora sensata haría,
¡iría al 23:59:60!
¡Y entonces todo se rompe porque tienes 61 segundos en un minuto!
Por lo que dependiendo de la implementación, ...
tu reloj estará un segund desincronizado del resto del mundo
o repite un segundo.
La manera que tienes de tratar con este problema es algo llamado Tiempo Unix.
Y Numberphile, creo, ya ha hablado de esto antes.
De que tienes este número que empezó en el primer segundo exacto de 1970
y aumenta un segundo, cada segundo.
Constantemente. Tic, tic, tic.
Y eso es genial porque lo único que tienes que hacer es coger cualquier fecha que te haya sido dada,
y lo calculas como Tiempo Unix,
y lo pones en tu base de datos.
Y eso simplemente tratará con los segundos adicionales
¡EXCEPTO QUE NO LO HAGA! ¡Por supuesto que no lo hace!
Porque tienes el Tiempo Universal Coordinado
¡que incluye los segundos adicionales!
Que se repite ocasionalmente, y simplemente incluye 23:59:60
¡y entonces tienes el tiempo astronómico! Que no incluye los segundos adicionales
y que ininterrumpidamente se ha empezado a descolgar del resto del mundo
¡porque necesitamos mirar a las estrellas y diseñar telescopios alrededor!
[suspiro profundo]
Y lo que aprendes...
Lo que aprendes despues de tratar con los husos horarios, es que lo que haces...
... es que dejas a un lado tu código ...
... no intentas escribir nada para tratar con esto.
Miras a la gente que ha estado ahí antes que tú.
Miras a las primeras personas, las primeras que tuvieron que tratar con esto antes,
las personas que tuvieron que construir ese código espagueti,
y les agradeces mucho que hayan hecho su código abierto,
y les das una ayuda, y coges lo que han hecho y lo implementas en tu programa,
y no lo vuelves a mirar.
porque de esa manera te quitas un problema.
Google hoy en día tiene una buena aproximación de los segundos adicionales que han crado ellos mismos.
Hay un artículo sobre ello en su bolog, creo, que lo explica.
Y hacen algo que se llama "mancha adicional"
Porque tener 61 segundos en un minuto,
o teniendo un reloj que retroceda un segundo,
puede ser, muy, muy malo para las grandes agencias que tengan
que sincronizar todo de manera muy precisa y tengan que creerse ese bit de información que ha sido almacenado antes de otro,
ellos esencialmenten mezclan el segundo con el resto del día.
Y incrementan su reloj un microsegundo a la vez.
Tic, tic, tic, todo el rato durante el día.
Eso es por lo que, quizás estamos medio segundo atrasados de la realidad,
pero siempre y cuando todo en nuestros servidores esté un segundo atrasado.
Está construido para estar medio segundo desincronizado con el mundo, sabiendo que una cosa ocurrió antes que otra.
Tener continuidad es más importante que tener un tiempo preciso.