import datetime as dt

print("Maintenant naif  :", dt.datetime.now())

instant = dt.datetime.now(dt.timezone(dt.timedelta(hours=2)))

print("Maintenant aware :", instant)
print("Info timezone    :", instant.tzinfo)

instant = dt.datetime.now(dt.timezone(dt.timedelta(hours=2), name="France"))
print("Maintenant aware :", instant)
print("Info timezone    :", instant.tzinfo)

instant = dt.datetime.now(dt.timezone(dt.timedelta(hours=2), name="plus_2"))
autre_instant = dt.datetime.now(dt.timezone(dt.timedelta(hours=1), name="plus_1"))
print("Maintenant aware 2 :", instant)
print("Maintenant aware 1 :", autre_instant)

autre_instant - instant

"""
Explanation: Les dates et les timezone
La librairie standard ne définit pas de timezone. Elle fournit une classe timezone, spécialisation simple de tzinfo qui s'instancie en passant en paramètre un timedelta. Celui-ci doit avoir +/- 12 heures.
End of explanation
"""


import pytz
paris_tz = pytz.timezone('Europe/Paris')
print(paris_tz)
paris_tz

"""
Explanation: Avec la librairie pytz
Dans la cellule suivante, nous définissons un timezone pour la France
End of explanation
"""


pytz.all_timezones

"""
Explanation: Les valeurs possibles pour les timezone sont fournies par une constante.
End of explanation
"""


now_naive = dt.datetime.now()
print("Instant actuel naif:", now_naive)

h_paris_aware = paris_tz.localize(now_naive)
print("France, aware      :", h_paris_aware)

"""
Explanation: Nous créons d'abord une date naive à laquelle nous renseignons le timezone.
End of explanation
"""


new_york_tz = pytz.timezone('America/New_York')

print("Instant actuel naif:", now_naive)

h_new_york_aware = new_york_tz.localize(now_naive)
print("New York, aware    :", h_new_york_aware)

"""
Explanation: Nous utilisons cette même date pour créer une date aware à New York.
End of explanation
"""


h_new_york_in_paris = h_new_york_aware.astimezone(paris_tz)
print("France from US :", h_new_york_in_paris)

"""
Explanation: Nous changeons le timezone de cette date aware des US en France.
End of explanation
"""


h_new_york_aware == h_new_york_in_paris

"""
Explanation: Cette nouvelle date n'affiche pas les même heures, mais n'a pas non plus le même timezone. Nous pouvons vérifier qu'il s'agit de la même date.
End of explanation
"""


print("Heure US   :", h_new_york_aware.hour)
print("Heure Fr   :", h_paris_aware.hour)
print("Différence :", h_new_york_aware - h_paris_aware)

"""
Explanation: Les deux dates localisées contiennent la même information d'heure. Nous vérifions qu'il ne s'agit pas du même instant et qu'il y a un décalage d'une heure.
End of explanation
"""


winter_day = paris_tz.localize(dt.datetime(2019, 3, 30))
summer_day = paris_tz.localize(dt.datetime(2019, 4, 2))

print("Hiver :", winter_day)
print("Été.  :", summer_day)

print("Différence :", summer_day - winter_day)

after_3_days = winter_day + dt.timedelta(days=3)
print("3 jours plus tard :", after_3_days)

print("3 jours plus tard relocalisé :", after_3_days.astimezone(paris_tz))

"""
Explanation: Prise en compte du changement d'heure
Les problèmes de timezone ne se limitent pas au fuseau horaire mais également à la différence en fonction du changement d'heure. Ci dessous, nous définissons deux instants à minuit pour un jour en heure d'hiver et un jour en heure d'été.
End of explanation
"""


utc_tz = pytz.timezone('UTC')

meeting = dt.datetime(2020, 10, 15, 15, 30)

paris_tz = pytz.timezone('Europe/Paris')
meeting = meeting.astimezone(paris_tz).astimezone(utc_tz)

print(meeting)

new_york_tz = pytz.timezone('America/New_York')
print(f"for New Yoerkers : {meeting.astimezone(new_york_tz)}")

"""
Explanation: Voir donc les bonnes pratiques pour manipuler les dates comme :
End of explanation
"""


