Slide 1

Slide 1 text

https://pro.userland.fr/ Ruby, Rails, et les dates Le temps, c’est rageant. Goulven Champenois

Slide 2

Slide 2 text

Goulven Champenois Développeur Ruby on Rails indépendant

Slide 3

Slide 3 text

Quelques croyances erronées à propos du temps… https://in fi niteundo.com/post/25326999628/falsehoods-programmers-believe-about-time

Slide 4

Slide 4 text

Le 31 mars, une insomnie… 1:59 
 3:00 📱

Slide 5

Slide 5 text

L’heure d’été ! 🏊😎🚵

Slide 6

Slide 6 text

Appel du client Mes évènements sont décalés d’1h !

Slide 7

Slide 7 text

- date + début - date + fi n Bug au passage à l’heure d’été Saisie simplifiée

Slide 8

Slide 8 text

Fusionner Date et Time # DON'T DO THAT! - date.change(hour: time.hour, min: time.min) # OR - Time.local(date.year, date.month, date.day, time.hour, time.min, time.sec) # DO THIS INSTEAD + time.change(year: date.year, month: date.month, day: date.day) # OR + Time.utc(date.year, date.month, date.day, time.hour, time.min)

Slide 9

Slide 9 text

Quand du code manipule les heures,
 toujours véri fi er qu’il gère l’heure d’été. 👀 Moralité

Slide 10

Slide 10 text

freeze_time travel, travel_to, travel_back ActiveSupport::Testing::TimeHelpers 🫶

Slide 11

Slide 11 text

En parlant d’été…

Slide 12

Slide 12 text

L’Australie Fun fact : 3 fuseaux en « été » 5 fuseaux en « hiver » 🤦

Slide 13

Slide 13 text

J’ai bien lu +9,5 !? 24 38 fuseaux horaires Décalés de 60, 45, 30, 
 ou 15 minutes Et tout sauf linéaires…

Slide 14

Slide 14 text

Mais pourquoi 38 fuseaux ? Parce que le temps c’est de l’argent, —et de la politique, aussi.

Slide 15

Slide 15 text

Tout ça, c’est 
 à cause des rails (et des trains) Besoin d’horaires (départ et arrivée) Besoin que les villes aient toutes la même heure

Slide 16

Slide 16 text

Quand les utilisateurs 
 vivent à di ff érents endroits,
 toujours prendre en compte
 les fuseaux horaires. 👀 Moralité

Slide 17

Slide 17 text

TimeWithZone ~= Time Utilise la gemme TZ-info Gère les fuseaux horaires Gère aussi l’heure d’été ActiveSupport::TimeWithZone 🫶

Slide 18

Slide 18 text

Manipuler les dates et les heures # DON'T DO THAT! - Time.now - Time.parse # DO THIS INSTEAD + Time.zone.now + Time.zone.parse https://thoughtbot.com/blog/its-about-time-zones

Slide 19

Slide 19 text

Afficher une date ou une heure # DON'T DO THAT! - I18n.l(time) # DO THIS INSTEAD + I18n.l(time.in_time_zone(current_user.time_zone)) # OR, in ApplicationController + around_action :use_time_zone, if: :current_user + def use_time_zone(&block) + Time.use_zone(current_user.time_zone, &block) + end

Slide 20

Slide 20 text

Convertit les timestamps côté client Facilite la gestion du cache Gère l’I18N côté client Permet d’écrire « il y a X secondes, minutes… » local_time https://github.com/basecamp/local_time

Slide 21

Slide 21 text

Je parle trop vite ?

Slide 22

Slide 22 text

Faut que je boive alors 😊

Slide 23

Slide 23 text

Année solaire ou sidérale ? Année solaire : 1 tour de soleil Année sidérale : 365 rotations Di ff érence : environ 5 heures ! -> années bissextiles

Slide 24

Slide 24 text

Un peu d’histoire… ✦ Calendrier Julien ✦ Mis en place par Jules César ✦ Introduit en 46 avant JC (l’autre) ✦ Décalage : 11 minutes/an !

Slide 25

Slide 25 text

Le calendrier Grégorien ✦ Introduit en 1582 ✦ Par le pape Grégoire XIII ✦ Durée : 365,2422 jours/an ✦ C’est celui qu’on utilise ! ✦ 350 ans pour que tout le monde l’applique !

Slide 26

Slide 26 text

Les années bissextiles Multiple de 4 Mais PAS de 100 SAUF multiple de 400 Exemples : 2000, 2020, 2024… 2100

Slide 27

Slide 27 text

2070 et 503 années bissextiles plus tard…

Slide 28

Slide 28 text

Le 29 février 2024… Nouvelle-Zélande : pas d’essence Suède : pas de CB au supermarché Japon : pas de permis de conduire Chine : pas de mariage Paris : pas de lampadaires Etc…

Slide 29

Slide 29 text

Quand du code manipule les dates,
 toujours penser aux années bissextiles. 👀 Moralité

Slide 30

Slide 30 text

Modifier une date # DON'T DO THAT! - Date.new(2024, 2, 29).change(year: 2023) # => Date::Error: invalid date # WARNING Time.new(2024, 2, 29).change(year: 2023) # => 01 March 2023 # DO THIS INSTEAD + Date.new(2024, 2, 29).advance(years: -1) # OR + Date.new(2024, 2, 29) - 1.year # => 28 February 2023

Slide 31

Slide 31 text

Étend Numeric et Date/Time Ajoute Date/Time.advance Permet 1.month.ago, et 3.weeks.from_now ActiveSupport::Duration 🫶

Slide 32

Slide 32 text

Jours, heures… secondes ! ✦ Décalage du calendrier grégorien : 26 secondes/an ✦ Décalage année solaire/sidérale : variable Du coup, on ajoute des 
 secondes intercalaires.
 Qu’est-ce qui pourrait mal se passer ? 🫣

Slide 33

Slide 33 text

No content

Slide 34

Slide 34 text

TL;DR # DON'T DO THAT! - t2 - t1 # => -1s # DO THIS INSTEAD + (t2 - t1).clamp(0, t2) # => 0 # Et attention aux divisions par zéro !

Slide 35

Slide 35 text

Quand du code manipule des durées,
 toujours s’attendre à l’absurde. Le temps informatique 
 n’est pas linéaire. 👀 Moralité

Slide 36

Slide 36 text

Étend Date et Time date + 1.month 3.weeks_ago before? et after? Ajoute aussi all_day, all_week, all_month… Et même on_weekend? DateAndTime::Calculations 🫶

Slide 37

Slide 37 text

Les formats de dates AAAA/MM/JJ MM-JJ-AAAA JJ/MM/AA mois/JJ AAAA/ jour de l’année AA-W15-6 Calendrier bouddhiste (+543 ans) 🧘

Slide 38

Slide 38 text

Calendriers di ff érents Conventions par pays Préférences personnelles Décalages entre machines Le temps, c’est une langue

Slide 39

Slide 39 text

Temps du serveur / de la VM Temps de la base de données Temps de Rails (UTC par défaut) Temps navigateur Le temps est relatif

Slide 40

Slide 40 text

select_date / select_datetime date_select / datetime_select time_tag time_ago_in_words ActionView::Helpers::DateHelpers 🫶

Slide 41

Slide 41 text

Pour manipuler dates, heures ou durées
 toujours utiliser les méthodes disponibles ! Et ne jamais faire con fi ance 
 aux utilisateurs 😉 👀 Moralité

Slide 42

Slide 42 text

One more thing?

Slide 43

Slide 43 text

Standard international Interoperable (JS, PHP, Java…) Lisible, triable, non ambigu Parfait pour les APIs ! ISO 8601 require 'time' Time.zone.now.iso8601 Time.iso8601(string)

Slide 44

Slide 44 text

L’heure d’été Les fuseaux horaires Les années bissextiles Les formats de dates Les « failles » temporelles 👀 Toujours tester…

Slide 45

Slide 45 text

https://thoughtbot.com/blog/its-about- time-zones https://github.com/basecamp/local_time https://codeofmatt.com/list-of-2024-leap- day-bugs/ https://blog.cloud fl are.com/how-and-why- the-leap-second-a ff ected-cloud fl are-dns/ https://in fi niteundo.com/post/ 25326999628/falsehoods-programmers- believe-about-time Un peu de lecture

Slide 46

Slide 46 text

https://mastodon.social/@goulvench https://pro.userland.fr/ https://www.linkedin.com/in/ goulvenchampenois/ Merci pour votre temps !