TOUT CE

QUE VOUS N'AVEZ JAMAIS

VOULU SAVOIR

SUR LES FUSEAUX

HORAIRES

Qu'est-ce qu'une date exactement ?

Un moyen de se repérer dans le temps

  • une année
  • un mois
  • un jour
  • une heure
  • une minute
  • une seconde
  • un fuseau horaire !
  • un calendrier !!

Le temps

Plusieurs façon de représenter un même "point temporel"

  • 17 avril 2024 à 14h30 à Paris
  • 17 avril 2024 à 20h30 à Singapour
  • 18 avril 2024 à 00h30 en Nouvelle-Zélande
  • 9 nissan 5784 à 14h30 (Paris, calendrier Hébraïque)
On peut ignorer certaines données en fonction du contexte.

THE END

merci

Pourquoi

les fuseaux horaires
c'est compliqué ?

Il est midi !
  • Paris : 🍕🍷
  • Tahiti : 😴🛏️
  • Lyon : ☕️

L'heure locale

Quirico Filopanti
Sandford Fleming

Les fuseaux horaires étranges

24 fuseaux horaires ?

Non : 37

Tout est politique

(ou économique) !

Cocorico !

UTC ou UTC+1 ?

Les Samoa

C'est le bordel…

DST

Daylight Saving Time

(l'heure d'été)

France

  • 1916 : heure d'été instaurée
  • 1945 : puis abandonnée
  • 1976 : rétablie "temporairement"
  • 1996 : harmonisée avec l'UE
  • DOM / COM : pas d'heure d'été
  • …sauf à Saint-Pierre-et-Miquelon qui change d'heure en même temps que… les États-Unis !

Union Européenne

Vers la fin du changement d'heure ?

États-Unis

Partout pareil… dans 48 des 50 états

👑 Australie 👑

Eté

Hiver

Des changements politiques tous les ans !

  • 2022-11-27 DST cancelation in Greenland
  • 2022-10-28 Changes in Mexico time zones
  • 2022-10-27 Fiji stays on standard time
  • 2022-10-05 Permanent daylight saving time in Jordan
  • 2022-10-05 Permanent daylight saving time in Syria
  • 2022-09-06 Palestine summer time will end one day later than expected
  • 2022-08-10 Chile postpones DST one week
  • 2022-05-12 Iran cancels daylight saving time
  • 2022-03-14 Palestine summer time will start one day later than expected

(Entre 5 et 10 changements chaque année !)

🔗 https://time.is/time_zone_news

En informatique

La norme :

ISO 8601 / RFC 3339

« Représentation de la date et l'heure »

2024-04-17T07:35:00-07:00

Le standard des fuseaux horaires ?

Il n'y en a pas !

Proposition d'étendre la RFC3339 :

2023-10-29T02:30:00+02:00[Europe/Paris]

Les languages

Comment gérer ce bazar ?

Valeur par défaut ?

new Date('2024-04-17T14:35:00').toString()
"Wed Apr 17 2024 14:35:00 GMT+0200 (heure d’été d’Europe centrale)"
Sur un serveur :
new Date('2024-04-17T14:35:00').toString()
"'Wed Apr 17 2024 14:35:00 GMT+0000 (temps universel coordonné)"

Soyez explicites !

Donnez toujours le fuseau horaire

Ruby : Time ou DateTime ?

`DateTime` ne gère ni les secondes intercalaire, ni n'assure le suivi d'aucune règle de changement d'heure d'été.
[…]
Si vous voulez aussi gérer les fuseaux horaires, alors bon courage […]

23 avril

Journée mondiale du livre et du droit d'auteur

Cervantes
☠️ 23 avril 1616
Shakespeare
☠️ 23 avril 1616
☠️ 3 mai 1616

Java

Semble très bien géré*

OffsetDateTime, ZonedDateTime and Instant all store an instant on the time-line […]
Documentation package Java `time`

Le format JavaZDT vient de Java !

* mais je ne maîtrise pas le language

PHP


          
  • Librairie standard top !
  • Ne gère pas le format JavaZDT
php.net/datetime

Python

  • Fonctionnel, mais pas top*
  • Fuseaux horaires qui fonctionne pas ou mal sous Windows
  • Python 3.2 : classe timezone
  • Python 3.9 : classe "ZoneInfo" (pour utiliser la base du IANA)
documentation SPL zoneinfo
* mais je ne maîtrise pas le language

JavaScript

Pire librairie possible : API pas pratique, sujette à l'erreur, inconsistante, pas vraiment de gestion des fuseaux horaires

d = new Date()
>> Date Wed Apr 17 2024 14:35:00 GMT+0200 (heure d’été d’Europe centrale)

d.getDay() // en fait : day of week
>> 3
d.getDate() // day ?
>> 17
d.getMonth() // 0-indexé
>> 3

JavaScript

  • MomentJS, super puissant : API top et super simple a utiliser.
  • moment-timezone fait 1 Mo de donnée (111Ko gzippé + 72ko pour moment)
  • Remplacé par luxon, day.js, et surtout par Temporal

SQL : c'est compliqué

Comment les DB gèrent les TimeZones ?

le standard SQL possède un mélange étrange de types de date/heure et de possibilités.
documentation de Postgresql
SQL : un fuseau horaire défini sur le serveur.
Gestion possible de la TimeZone par session.

Testons :

SELECT '2024-01-01 00:00+10'::timestamptz;
        timestamptz
  ------------------------
    2023-12-31 15:00:00+01
  (1 row)
Toutes les dates et heures liées à un fuseau horaire sont stockées en interne en UTC.

Oui… mais en fait non !

  • 2 lignes avec des fuseaux horaires différents ?
  • Décalage UTC != fuseau horaire

Conversion de fuseaux horaires

  • MySQL / MariaDB : CONVERT_TZ(datetime, from_tz, to_tz)
  • SQLServer / Postgresql : datetime AT TIME ZONE to_TZ

Du coup, on stocke comment ?

| value               | timezone     |
| ------------------- | ------------ |
| 2024-04-17T12:35:00 | Europe/Paris |
  • l'heure locale de la donnée ?
  • l'heure UTC de la donnée (et il est donc 14h35 heure de Paris) ?

Dans une API

Dans une API

Même combat que pour SQL, mais avec un peu plus de flexibilité

  • RFC3339 : OK pour de l'affichage
  • Format JavaZDT ?
  • Deux clés : une pour la date, une pour le fuseau horaire
    {
      "date": "2024-04-17T14:35:00+02:00",
      "timezone": "Europe/Paris"
    }

Le bug de 2038

Dessin de XKCD expliquant qu'on avait passé le point entre les correctifs du bugs de l'an 2000 et la préparation du bug de 2038

© xkcd

Ça arrive à tout le monde

Github

© Lenz Weber-Tronic (twitter)

Ça arrive à tout le monde

Téléphone One Plus

© S. Grégeois

La vie, l'univers et le reste

La vie, l'univers et le reste

Un p'ti dernier pour la route ?

Un p'ti dernier pour la route ?

La (vraie) fin

Julien Deniau
🐘 Dev PHP sur Lyon ? mapado.xyz/php

Sources