Python-Zeitzonenumwandlung



python strftime timezone (6)

Ich bin auf der Suche nach einem schnellen Weg, um eine Zeit einzugeben und dann Python in andere Zeitzonen umwandeln (vielleicht bis zu 10 verschiedene Zeitzonen)

Es tut uns leid. Ich bin überhaupt nicht mit der Zeit in Python vertraut, wenn jemand mich in die richtige Richtung bringen könnte, würde ich es wirklich schätzen.


Verwenden von 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)

Ich hoffe, ich bin nicht zu spät!

Die pendulum Bibliothek zeichnet sich bei dieser und anderen Datum-Zeit-Berechnungen aus.

>>> 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 listet die Namen der Zeitzonen auf, die mit Pendel verwendet werden können. (Sie sind die gleichen wie für Pytz.)


Für Python 3.2+ ist simple-date ein Wrapper um pytz, der versucht Dinge zu vereinfachen.

Wenn du time hast

SimpleDate(time).convert(tz="...")

kann tun, was Sie wollen. Aber Zeitzonen sind ziemlich komplexe Dinge, so kann es erheblich komplizierter werden - siehe simple-date .


Um eine Zeit in einer Zeitzone in eine andere Zeitzone in Python zu konvertieren, könnten Sie astimezone :

time_in_new_timezone = time_in_old_timezone.astimezone(new_timezone)

Gegeben aware_dt (ein datetime Objekt in einer bestimmten Zeitzone), um es in andere Zeitzonen zu konvertieren und die Zeiten in einem bestimmten Zeitformat zu drucken:

#!/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}}")

Wenn die Syntax von f"" nicht verfügbar ist, können Sie sie durch "".format(**vars()) ersetzen.

wo du aware_dt von der aktuellen Zeit in der lokalen Zeitzone setzen aware_dt :

from datetime import datetime
import tzlocal  # $ pip install tzlocal

local_timezone = tzlocal.get_localzone()
aware_dt = datetime.now(local_timezone) # the current time

Oder aus der Eingabezeit-Zeichenfolge in der lokalen Zeitzone:

naive_dt = datetime.strptime(time_string, time_format)
aware_dt = local_timezone.localize(naive_dt, is_dst=None)

wo time_string könnte aussehen: '2016-11-19 02:21:42' . Es entspricht time_format = '%Y-%m-%d %H:%M:%S' .

is_dst=None erzwingt eine Ausnahme, wenn die Zeichenfolge für die Eingabezeit einer nicht vorhandenen oder mehrdeutigen lokalen Zeit entspricht, z. B. während eines DST-Übergangs. Sie könnten auch is_dst=False , is_dst=True . Siehe Links mit mehr Details bei Python: Wie konvertierst du Datetime / Timestamp von einer Zeitzone in eine andere?


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 : Datum Zeit Zeichenfolge
  • tz1 : Anfangszeitzone
  • tz2 : Zielzeitzone

-

> 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']

Ich habe gefunden, dass der beste Ansatz darin besteht, den interessierenden "Moment" in ein utc-Zeitzonen-bewusstes Datetime-Objekt zu konvertieren (in Python ist die Zeitzonenkomponente für datetime Objekte nicht erforderlich).

Dann können Sie mit astimezone in die Zeitzone von Interesse ( reference ) konvertieren.

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

Also, mit dem Moment von Interesse in der lokalen Zeitzone (eine Zeit, die exists ), konvertierst du es in utc so ( reference ).

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




timezone