Je cherche un moyen rapide de saisir une heure, puis python la convertir en une autre fuseau horaire (peut-être jusqu'à 10 fuseaux horaires différents)
Désolé. Je ne suis pas familier avec le temps dans python), si quelqu'un pouvait me mettre dans la bonne direction, je l'apprécierais vraiment.
J'ai constaté que la meilleure approche consiste à convertir le "moment" qui présente un intérêt en un objet datetime prenant en compte l'utc-timezone (en python, le composant timezone n'est pas requis pour les objets datetime ).
Ensuite, vous pouvez utiliser astimezone pour convertir le fuseau horaire d’intérêt ( référence ).
from datetime import datetime
import pytz
utcmoment_naive = datetime.utcnow()
utcmoment = utcmoment_naive.replace(tzinfo=pytz.utc)
# print "utcmoment_naive: {0}".format(utcmoment_naive) # python 2
print("utcmoment_naive: {0}".format(utcmoment_naive))
print("utcmoment: {0}".format(utcmoment))
localFormat = "%Y-%m-%d %H:%M:%S"
timezones = ['America/Los_Angeles', 'Europe/Madrid', 'America/Puerto_Rico']
for tz in timezones:
localDatetime = utcmoment.astimezone(pytz.timezone(tz))
print(localDatetime.strftime(localFormat))
# utcmoment_naive: 2017-05-11 17:43:30.802644
# utcmoment: 2017-05-11 17:43:30.802644+00:00
# 2017-05-11 10:43:30
# 2017-05-11 19:43:30
# 2017-05-11 13:43:30
Donc, avec le moment d’intérêt dans le fuseau horaire local (un moment où existe ), vous le convertissez en utc comme ceci ( référence ).
localmoment_naive = datetime.strptime('2013-09-06 14:05:10', localFormat)
localtimezone = pytz.timezone('Australia/Adelaide')
try:
localmoment = localtimezone.localize(localmoment_naive, is_dst=None)
print("Time exists")
utcmoment = localmoment.astimezone(pytz.utc)
except pytz.exceptions.NonExistentTimeError as e:
print("NonExistentTimeError")
Utiliser pytz
from datetime import datetime
from pytz import timezone
fmt = "%Y-%m-%d %H:%M:%S %Z%z"
timezonelist = ['UTC','US/Pacific','Europe/Berlin']
for zone in timezonelist:
now_time = datetime.now(timezone(zone))
print now_time.strftime(fmt)
Pour convertir une heure d’un fuseau horaire en un autre fuseau horaire en Python, vous pouvez tilisez datetime.astimezone()
:
time_in_new_timezone = time_in_old_timezone.astimezone(new_timezone)
Étant donné aware_dt
(Un objet datetime
dans un fuseau horaire), pour le convertir en un autre fuseau horaire et pour imprimer les heures dans un format d'heure donné:
#!/usr/bin/env python3
import pytz # $ pip install pytz
time_format = "%Y-%m-%d %H:%M:%S%z"
tzids = ['Asia/Shanghai', 'Europe/London', 'America/New_York']
for tz in map(pytz.timezone, tzids):
time_in_tz = aware_dt.astimezone(tz)
print(f"{time_in_tz:{time_format}}")
Si la syntaxe f""
N'est pas disponible, vous pouvez la remplacer par "".format(**vars())
où vous pouvez définir aware_dt
à partir de l'heure actuelle dans le fuseau horaire local:
from datetime import datetime
import tzlocal # $ pip install tzlocal
local_timezone = tzlocal.get_localzone()
aware_dt = datetime.now(local_timezone) # the current time
Ou à partir de la chaîne de temps d'entrée dans le fuseau horaire local:
naive_dt = datetime.strptime(time_string, time_format)
aware_dt = local_timezone.localize(naive_dt, is_dst=None)
où time_string
pourrait ressembler à: '2016-11-19 02:21:42'
. Cela correspond à time_format = '%Y-%m-%d %H:%M:%S'
.
is_dst=None
Force une exception si la chaîne d'heure en entrée correspond à une heure locale non existante ou ambiguë, comme lors d'une transition DST. Vous pouvez également passer is_dst=False
, is_dst=True
. Voir les liens avec plus de détails sur Python: Comment convertir une date/un horodatage d’un fuseau horaire vers un autre??
Pour les conversions de Python fuseau horaire, j'utilise le table pratique du PyCon 2012 présentation de Taavi Burns.
import datetime
import pytz
def convert_datetime_timezone(dt, tz1, tz2):
tz1 = pytz.timezone(tz1)
tz2 = pytz.timezone(tz2)
dt = datetime.datetime.strptime(dt,"%Y-%m-%d %H:%M:%S")
dt = tz1.localize(dt)
dt = dt.astimezone(tz2)
dt = dt.strftime("%Y-%m-%d %H:%M:%S")
return dt
-
dt
: chaîne de date/heuretz1
: fuseau horaire initialtz2
: fuseau horaire cible-
> convert_datetime_timezone("2017-05-13 14:56:32", "Europe/Berlin", "PST8PDT")
'2017-05-13 05:56:32'
> convert_datetime_timezone("2017-05-13 14:56:32", "Europe/Berlin", "UTC")
'2017-05-13 12:56:32'
-
> pytz.all_timezones[0:10]
['Africa/Abidjan',
'Africa/Accra',
'Africa/Addis_Ababa',
'Africa/Algiers',
'Africa/Asmara',
'Africa/Asmera',
'Africa/Bamako',
'Africa/Bangui',
'Africa/Banjul',
'Africa/Bissau']
Remarque: la première partie de cette réponse est la version 1.x du pendule. Voir ci-dessous pour une réponse en version 2.x.
J'espère que je ne suis pas trop en retard!
La bibliothèque pendule excelle dans ce calcul et dans d’autres calculs de date-heure.
>>> import pendulum
>>> some_time_zones = ['Europe/Paris', 'Europe/Moscow', 'America/Toronto', 'UTC', 'Canada/Pacific', 'Asia/Macao']
>>> heres_a_time = '1996-03-25 12:03 -0400'
>>> pendulum_time = pendulum.datetime.strptime(heres_a_time, '%Y-%m-%d %H:%M %z')
>>> for tz in some_time_zones:
... tz, pendulum_time.astimezone(tz)
...
('Europe/Paris', <Pendulum [1996-03-25T17:03:00+01:00]>)
('Europe/Moscow', <Pendulum [1996-03-25T19:03:00+03:00]>)
('America/Toronto', <Pendulum [1996-03-25T11:03:00-05:00]>)
('UTC', <Pendulum [1996-03-25T16:03:00+00:00]>)
('Canada/Pacific', <Pendulum [1996-03-25T08:03:00-08:00]>)
('Asia/Macao', <Pendulum [1996-03-26T00:03:00+08:00]>)
Answer liste les noms des fuseaux horaires pouvant être utilisés avec le pendule. (Ils sont les mêmes que pour Pytz.)
Pour la version 2:
some_time_zones
est une liste des noms des fuseaux horaires pouvant être utilisés dans un programmeheres_a_time
est un exemple de temps, complété par un fuseau horaire de la forme '-0400'show_time_zones
...
>>> import pendulum
>>> some_time_zones = ['Europe/Paris', 'Europe/Moscow', 'America/Toronto', 'UTC', 'Canada/Pacific', 'Asia/Macao']
>>> heres_a_time = '1996-03-25 12:03 -0400'
>>> pendulum_time = pendulum.from_format('1996-03-25 12:03 -0400', 'YYYY-MM-DD hh:mm ZZ')
>>> for tz in some_time_zones:
... tz, pendulum_time.in_tz(tz)
...
('Europe/Paris', DateTime(1996, 3, 25, 17, 3, 0, tzinfo=Timezone('Europe/Paris')))
('Europe/Moscow', DateTime(1996, 3, 25, 19, 3, 0, tzinfo=Timezone('Europe/Moscow')))
('America/Toronto', DateTime(1996, 3, 25, 11, 3, 0, tzinfo=Timezone('America/Toronto')))
('UTC', DateTime(1996, 3, 25, 16, 3, 0, tzinfo=Timezone('UTC')))
('Canada/Pacific', DateTime(1996, 3, 25, 8, 3, 0, tzinfo=Timezone('Canada/Pacific')))
('Asia/Macao', DateTime(1996, 3, 26, 0, 3, 0, tzinfo=Timezone('Asia/Macao')))
For Python 3.2+ simple-date est un wrapper autour de pytz qui tente de simplifier les choses.
Si vous avez un time
alors
SimpleDate(time).convert(tz="...")
peut faire ce que tu veux. Mais les fuseaux horaires sont des choses assez complexes, donc ça peut devenir beaucoup plus compliqué - voir le les docs .