Slide 1

Slide 1 text

Timezone “Date & Time for dummies” @Exirel // #Devcamp

Slide 2

Slide 2 text

Définition ● Le Temps universel est une échelle de temps basée sur la rotation de la Terre. ● Un fuseau horaire est une zone de la surface terrestre où l'heure est identique en tout lieu. ● L'heure d'Été consiste, pour une zone de la surface terrestre, à changer de fuseaux horaires pour une période donnée.

Slide 3

Slide 3 text

Problèmes

Slide 4

Slide 4 text

Théorie ● Un fuseau horaire est une zone où l'heure est identique en tout lieu. ● 24 fuseaux horaires de même taille. ● Le premier fuseau est centré sur le méridien de Greenwich. ● La zone fait 15° et est centrée sur un méridien dont la longitude est multiple de 15°

Slide 5

Slide 5 text

Pratique Carte des fuseaux horaires

Slide 6

Slide 6 text

Répartition géographique ● 43 fuseaux ou zones horaires (42 officiels) ● Dont 37 toute l'année ● Mais pas forcément par les mêmes pays – deux seulement à l'heure d'hiver boréale (UTC-3:30 et UTC+3:30) – un uniquement à l'heure d'hiver australe (UTC+12:45) – un exclusivement à l'heure d'été boréale (UTC-2:30) – un dernier uniquement à l'heure d'été australe (UTC+13:45).

Slide 7

Slide 7 text

Daylight Saving Time ● L’heure d’Été est un système consistant à ajuster l’heure officielle ● Ajoute une heure par rapport à l'heure locale ● Du printemps jusqu'à la fin de l'été ou le début de l’automne ● En Europe, dates normées et fixées au moins 5 ans à l'avance.

Slide 8

Slide 8 text

Carte de l'heure d'Été Bleu : l'utilise toujours. Orange : ne l'utilise plus. Rouge : ne l'a jamais utilisé.

Slide 9

Slide 9 text

Résultat

Slide 10

Slide 10 text

La carte des zones horaires Timezone map (TZ Database)

Slide 11

Slide 11 text

IANA Time Zone Database ● Créée par Arthur David Olson ● Convention de nommage spécifique : – America/Chicago, America/New_York – Europe/Paris, Europe/London – Asia/Seoul, Asia/Tel_Aviv ● Gère le DST ● Gère les secondes intercalaires

Slide 12

Slide 12 text

Solution (du code)

Slide 13

Slide 13 text

Use python! >>> import pytz >>> from datetime import datetime

Slide 14

Slide 14 text

UTC >>> datetime.utcnow() datetime.datetime(2013, 11, 13, 10, 53, 52, 978000) >>> pytz.utc.localize(datetime.utcnow()) datetime.datetime(2013, 11, 13, 10, 53, 59, 463000, tzinfo=) >>>

Slide 15

Slide 15 text

Local time >>> naive = datetime.utcnow() >>> aware = pytz.utc.localize(naive) >>> tz = pytz.timezone('Europe/Paris') >>> local = aware.astimezone(tz) >>> local datetime.datetime(2013, 11, 13, 12, 4, 30, 931000, tzinfo=)

Slide 16

Slide 16 text

Explications

Slide 17

Slide 17 text

Naive vs Aware ● Naive datetime : – Sans information de Timezone – naive = datetime.now() – aware_local = local_tz.localize(naive) ● Aware datetime : – Avec une Timezone – aware_utc = aware.astimezone(pytz.utc)

Slide 18

Slide 18 text

One Can Not Simply Mix Naive and Aware datetime in the same operation.

Slide 19

Slide 19 text

Naive >>> d1_naive.strftime(date_format) “27 October 2013, 02:00” >>> d2_naive.strftime(date_format) “27 October 2013, 02:00” >>> d2_naive d1_naive – 0

Slide 20

Slide 20 text

Aware >>> d1_aware.strftime(date_format) “27 October 2013, 02:00” >>> d2_aware.strftime(date_format) “27 October 2013, 02:00” >>> d2_aware d1_aware –

Slide 21

Slide 21 text

Aware >>> d1_aware.strftime(date_format) “27 October 2013, 02:00” >>> d2_aware.strftime(date_format) “27 October 2013, 02:00” >>> d2_aware d1_aware – 1

Slide 22

Slide 22 text

Aware >>> d1_aware.strftime(date_format) “27 October 2013, 02:00 UTC+02:00” >>> d2_aware.strftime(date_format) “27 October 2013, 02:00 UTC+01:00” >>> d2_aware d1_aware – 1

Slide 23

Slide 23 text

Timezone avec TZ Data ● Zone horaire : tz_local = pytz.timezone('Europe/Paris') ● Une zone horaire change de fuseau horaire pour l'heure d'Été : – Avant : CEST (Central European Summer Time) – Après : CET (Central European Time)

Slide 24

Slide 24 text

Bonnes pratiques

Slide 25

Slide 25 text

UTC in, Local out ● Lire vers UTC pytz.utc.localize ● Ecrire depuis UTC local_tz = pytz.timezone('Europe/Paris') utc_aware.astimezone(local_tz)

Slide 26

Slide 26 text

Utiliser les timezones ● Récupérer une timezone : pytz.timezone('Europe/Paris') ● Localiser une date naïve : tz.localize ● Transformer d'une TZ à une autre : aware_local.astimezone(tz_far_away)

Slide 27

Slide 27 text

Ne réinventez pas la roue ● TZ Database existe déjà, utilisez la ! ● Ne manipulez pas les dates comme des nombres entiers ● Si votre langage ne peut pas le faire pour vous... ● … changez de langage !

Slide 28

Slide 28 text

Merci !