Un jour ou l'autre, tous les programmeurs doivent s'occuper des fuseaux horaires.
Et je ne peux pas vraiment donner des conseils, mais je peux vous raconter un récit édifiant.
Je peux vous dire pourquoi vous devez absolument éviter de vous en occuper si vous en avez l'occasion.
Imaginons que quelqu'un a conçu une application
permettant de calculer depuis combien de secondes quelque chose s'est passé.
Vous tapez une date et une heure et cela vous donne le nombre de secondes.
Et ils regardent ça et ils pensent "OK, ça a l'air de fonctionner pour moi..."
Mais ajoutons une petite boîte pour changer le fuseau horaire"
Donc si on décide de comparer entre maintenant à New York et il y a 5 jours à Londres, ça fonctionne.
Et c'est bien. La petite boîte vous permet de changer combien de temps vous êtes par rapport à Greenwich, que ce soit en avance ou en retard
Brillant.
Un jour ou l'autre, après que l'application devienne populaire, ils reçoivent un appel d'Australie
Et l'Australie va dire "G'Day ma-"
-Je ne vais pas essayer de faire les accents.
Je dois juste éviter les accents
L'Australien va dire "Bonjour !"
"Au fait, on est 9h½ en avance de Greenwich"
Et le programmeur dira "Vraiment ?"
"Oui, 9h½"
"OK, je vais ajouter ce cas pour vous. Pas de problème"
Un peu plus tard quelqu'un appelle du Népal.
Et il dit "Bonjour ! On est 5h¼ en avance de Greenwich."
Le programmeur demandera "Vraiment ?" "Oui, on est comme ça depuis longtemps ! Oui, 5h¼"
"Super. D'accord" et ils ajoutent un cas spécifique en plus.Et après ils vérifieront peut-étre
la liste des fuseaux horaires. La liste officielle vous disant
ce à quoi tout correspond et ils s'assurent qu'ils ont couvert tout les fuseaux dans le monde.
Et puis l'automne arrive.
Et ils reçoivent un appel d'Angleterre
Et l'Angleterre leur dit "Euh pardonnez moi mais on dirait qu'on a 1 H de décalage, que se passe t-il?"
"Attendez, on a changé les heures"
"Oh c'est normal, mais attendez, on s'est déjà occupé de ça"
"On a fait une note pour les changements d'heure et on l'a intégré dans l'application."
L'Angleterre leur répond : "Non, vous voyez, nous on change une semaine avant"
"C'est différent en fonction d'où vous habitez"
"On remonte nos horloges une semaine avant vous"
Et à ce moment là
le programmeur va généralement commencer a mettre sa tête entre ses mains
et se rendre compte de ce dans quoi il s'est lancé.
Mais ça va aller ! Ils programment ça
et s'occupent de tous les pays qui changent les heures un autre jour.
Ils regardent le fichier qui leur dit comment faire et ils copient ça dedans.
Ensuite ils reçoivent un appel de quelqu'un dans l'hémisphère sud pour leur dire
"Oui, nous on ne recule pas en automne, on avance"
"Notre printemps...est en novembre."
A ce moment-là ils commencent à réfléchir à leur alcool préféré
et à se demander s'ils devraient avoir un petit verre avant de continuer...
...Et ils codent ça aussi.
Ensuite ils reçoivent un appel des îles Samoa
dans le Pacifique sur la Ligne de Changement de Date.
Et Samoa leur dit "Bonjour !"
"Oui, on a passé un jour il y a quelque temps"
Et le programmeur dit "Quoi ?!"
"Oui, on a passé un jour. On est passé du 29 Décembre 2011 au 31 Décembre"
"On est passé d'un coté de la ligne de changement d'heure, des heures et des heures avant Greenwich ..
...de l'autre coté, des heures et des heures en avance de Greenwich. Ça nous aide pour le commerce avec l'Australie."
"Est-ce-que vous pourriez prendre ceci en compte quand vous calculer combien de jours ou de secondes dans le passé se situe une date ?"
[soupir] D'accord, il y a un fichier indiquant quand chaque pays a changé de fuseau horaire
Ce qui se révèle être assez fréquent.
Mais c'est annoncé à l'avance donc tant que ce fichier est actualisé régulièrement
et qu'on code ça dans le logiciel en fonction, tout ira bien.
Et puis vous regardez en arrière et vous remarquez que durant la Seconde Guerre Mondiale,
l'Angleterre avait doublé le changement d'heure
C'est rentré dans les moeurs, et ils ont juste ajouté une heure de plus.
Donc ils avaient 2 h d'avance par rapport à Greenwich...Même si Greenwich est en Angleterre.
D'accord, vous vous occupez de ce détail.
Vous avez remarqué que j'ai commencé à en parler comme si c'était vous ou moi ?
C'est parce que j'ai déjà fait ça avant et c'est vraiment très, très frustrant
Et vous faites en sorte de vous abonnez à la liste
disant quand les pays vont changer leur fuseaux horaires-ce qui arrive visiblement de nombreuses fois !
Par exemple dans certains cas, plusieurs fois par an, parce que le gouvernement change.
Ensuite ce programmeur héroique reçoit un appel de Libye,
qui en 2013, avec seulement quelques jours avant, ont décidé qu'ils n'allaient pas reculer l'heure.
Avec trop peu de temps d'avance pour qu'il soit possible pour quiconque de faire les mises à jour à temps.
Ce qui veut dire que chaque ordinateur Libyen, qu'importe son système d'exploitation...
...avait une heure de décalage.
C'est Ok, vous lisiez un article parlant de ça et vous vous dépêchiez de coder ça aussi.
Et ensuite vous recevez un appel de la West Bank.
Où la population Israélienne est à une heure différente de la population Palestinienne.
Parce que une suit Israël et l'autre non.
Maintenant, vous avez 2 populations au même endroit qui ont deux fuseaux différents
Et donc ils doivent se demander s'ils sont dans ce fuseau ou l'autre en fonction de où et qui ils sont.
Et ils n'y a aucun moyen de coder ça dans votre programme ! Et ensuite..
Ensuite vous recevez un appel de l'historien.
Il vous dit "Bon, j'essaye de calculer une différence du temps depuis le 18ème siècle"
"Et on est passé du calendrier Julien au calendrier Grégorien"
"Et ce n'est pas le fait qu'on ait perdu 3 semaines...
...c'est juste qu'on est passé de cette date à cette autre date et qu'on a oublié les dates intermédiaires"
"Est-ce-que vous pourriez coder ça pour que ça puisse m'aider ?"
C'est bien parce que quelqu'un vous a déjà dit ces dates
et donc vous pouvez les coder dans la logique de votre programme aussi
mais maintenant le code a l'air très long et vraiment compliqué
comme un mélange chaotique de spaghetti de lignes de code qui fonctionne d'une manière ou d'une autre
et après vous recevez un appel de l'historien russe !
Qui vous dit "Oui on est seulement passé au calendrier Grégorien au 20ème siècle ...
...et on dirait que les dates que vous avez passés changent en fonction de l'endroit...
...et est-ce-que vous pourriez vous occupez de ça aussi ? Et ensuite vous recevez un appel de l'historien Britannique !
Qui vous dit que jusqu'au, je pense que c'est le 16ème siècle...
l'année commençait le 25 Mars !
juste pour détruire votre esprit
On passe du 24 Mars 924
au 25 mars 925. Et c'est le jour qui suit.
Parce que vous passez du 31 décembre au 1er janvier 924 parce que ça fonctionne dans cet ordre!
c'est affreusement compliqué. ET ENSUITE...
vous recevez un appel de l'astrophysicien...
Qui dit "au fait on a rajouté une seconde de saut !"
Et à ce moment vous dites juste "QUOI ?!"
Des secondes en plus ; parce que la Terre ne tourne pas à une vitesse constante.
Elle ralentit, elle accélère quand les plaques tectoniques bougent
et que les champs magnétiques se déplacent ou quelque chose du genre. Et donc à certaines occasions,
l'Union Astronomique Internationale va décider quand on aura besoin d'une seconde en plus
et donc les horloges vont de 23:59:58
puis 23:59:59
et au lieu que de passer à 00:00:00 comme n'importe quel fuseau horaire ferait,
on passe à 23:59:60!
Et tout déraille parce que d'un seul coup vous avez 61 secondes dans une minute !
Donc en fonction de votre implémentation, soit...
votre horloge sera 1 seconde en retard avec le reste du monde
ou elle répétera 1 seconde
Le moyen de s'en sortir avec ça implique ce qu'on appelle la date universelle Unix
Et Numberphile en a déjà parlé avant je crois.
Et vous avez ce nombre qui a commencé précisément à la 1ére seconde de 1970
et qui ajoute 1 seconde, puis 1 seconde.
En permanence.Tic.Tac.Tic
et c'est génial parce que tout ce que vous avez à faire est de prendre la date qui vous a été donné,
et la calculer en date universelle Unix,
et vous mettez ça dans votre base de données,
et ça calculera les secondes supplémentaires
SAUF QUE NON ! Bien sur que non !
Parce que vous avez le Temps Universel Coordonné
qui inclut les secondes supplémentaires !
ça se répète occasionnellement et inclut 23:59:60
et vous avez aussi le temps astronomique ! qui ne comprend pas les secondes supplémentaires (de saut)
et est donc tranquillement désynchronisée avec le reste du monde
vu que l'on doit observer les étoiles et construire des télescopes autour ce principe !
[soupir profond ]
Et ce que vous apprenez ...
Ce que vous apprenez après vous être occupés de fuseaux horaires, c'est que ce que vous faites...
...c'est mettre votre code de coté...
...vous n'essayez pas d'écrire quelque chose pour s'en occuper.
Vous regardez les personnes qui étaient là avant vous.
Vous regardez les personnes qui étaient là bien avant, ceux qui ont du s'en occuper,
ceux qui ont cré le code spaghetti
Et vous les remerciez énormément de l'avoir rendu open source
et vous les créditez et vous prenez ce qu'ils ont fait et vous l'ajoutez à votre programme
et vous ne vous en occupez plus jamais.
On en deviendrait fou.
Google a une excellente approche qu'ils ont créé eux-mêmes pour les secondes supplémentaires
Il y a un article à propos sur leur blog qui l'explique.
Ils font ce qui est appelé "Leap Smear" (étirement supplémentaire)
Parce que avoir 61 secondes dans une minute
ou parce que votre systéme soit en retard d'une seconde
peut être désastreux pour d'immenses compagnies qui doivent
tout synchroniser parfaitement et prendre en compte ce qui se passait la seconde d'avant
ils étirent la seconde sur toute la journée
ils progressent d'une microseconde à la fois
tic, tac, tic durant toute la journée
et donc des fois ils sont même une demi-seconde en avance par rapport à la réalité
mais tant que tout dans leurs serveurs a cette demi seconde
c'est conçu pour ne pas être synchronisé avec le monde tant que ça sait que cette chose s'est passé était avant une autre.
Avoir une continuité est plus important qu'avoir le temps réel.