web-dev-qa-db-fra.com

Python Conversion du fuseau horaire

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.

54
Trying_hard

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")
73
juan

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)
41
shiva

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)

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??

7
jfs

Pour les conversions de Python fuseau horaire, j'utilise le table pratique du PyCon 2012 présentation de Taavi Burns.

4
akaihola
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/heure
  • tz1: fuseau horaire initial
  • tz2: 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']
4
Raffael

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 programme
  • heres_a_time est un exemple de temps, complété par un fuseau horaire de la forme '-0400'
  • Je commence par convertir le temps en pendule pour un traitement ultérieur
  • je peux maintenant montrer quelle est cette heure dans chacun des fuseaux horaires de 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')))
4
Bill Bell

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 .

2
andrew cooke