430 Stimmen

Wie konvertiert man eine lokale Zeitangabe in UTC?

Wie konvertiere ich eine datetime String in Ortszeit zu einer String in UTC-Zeit ?

Ich bin sicher, dass ich das schon einmal gemacht habe, aber ich kann es nicht finden, und SO wird mir (und anderen) hoffentlich helfen, das in Zukunft zu tun.

Klärung : Zum Beispiel, wenn ich habe 2008-09-17 14:02:00 in meiner lokalen Zeitzone ( +10 ), würde ich gerne eine Zeichenkette mit dem entsprechenden UTC Zeit: 2008-09-17 04:02:00 .

Auch von http://lucumr.pocoo.org/2011/7/15/eppur-si-muove/ Beachten Sie, dass dies im Allgemeinen nicht möglich ist, da es aufgrund der Sommerzeit und anderer Probleme keine eindeutige Umrechnung von Ortszeit in UTC-Zeit gibt.

382voto

John Millikin Punkte 190278

Zunächst wird die Zeichenkette in ein naives Datetime-Objekt zerlegt. Dies ist eine Instanz von datetime.datetime ohne angehängte Zeitzoneninformationen. Siehe seine Dokumentation .

Verwenden Sie die pytz Modul, das eine vollständige Liste der Zeitzonen + UTC enthält. Ermitteln Sie die lokale Zeitzone, erstellen Sie daraus ein Zeitzonen-Objekt, bearbeiten Sie es und fügen Sie es an die naive Datetime an.

Schließlich verwenden Sie datetime.astimezone() Methode, um die Datumszeit in UTC zu konvertieren.

Quellcode, unter Verwendung der lokalen Zeitzone "America/Los_Angeles", für die Zeichenfolge "2001-2-3 10:11:12":

from datetime import datetime   
import pytz

local = pytz.timezone("America/Los_Angeles")
naive = datetime.strptime("2001-2-3 10:11:12", "%Y-%m-%d %H:%M:%S")
local_dt = local.localize(naive, is_dst=None)
utc_dt = local_dt.astimezone(pytz.utc)

Von dort aus können Sie die strftime() Methode, um die UTC-Datumszeit nach Bedarf zu formatieren:

utc_dt.strftime("%Y-%m-%d %H:%M:%S")

255voto

monkut Punkte 39059

ANMERKUNG -- Ab 2020 sollten Sie nicht mehr .utcnow() oder .utcfromtimestamp(xxx) . Da Sie vermutlich auf Python3 umgestiegen sind, sollten Sie zeitzonenbewusste Datetime-Objekte verwenden.

>>> from datetime import timezone
>>> 
>>> # alternative to '.utcnow()'
>>> dt_now = datetime.datetime.now(datetime.timezone.utc)
>>>
>>> # alternative to '.utcfromtimestamp()'
>>> dt_ts = datetime.fromtimestamp(1571595618.0, tz=timezone.utc)

für Einzelheiten siehe: siehe: https://blog.ganssle.io/articles/2019/11/utcnow.html

ursprüngliche Antwort (von 2010):

Das Modul datetime utcnow() kann verwendet werden, um die aktuelle UTC-Zeit zu ermitteln.

>>> import datetime
>>> utc_datetime = datetime.datetime.utcnow()
>>> utc_datetime.strftime("%Y-%m-%d %H:%M:%S")
'2010-02-01 06:59:19'

Wie der oben von Tom erwähnte Link: http://lucumr.pocoo.org/2011/7/15/eppur-si-muove/ sagt:

UTC ist eine Zeitzone ohne Sommerzeit und trotzdem eine Zeitzone ohne Konfigurationsänderungen in der Vergangenheit.

Messen und speichern Sie die Zeit immer in UTC .

Wenn Sie aufzeichnen müssen, wo die Zeit genommen wurde, bewahren Sie dies separat auf. Nicht speichern Sie die Ortszeit und die Zeitzoneninformation!

ANMERKUNG - Wenn Ihre Daten in einer Region liegen, in der die Sommerzeit gilt, verwenden Sie pytz und sehen Sie sich die Antwort von John Millikin an.

Wenn Sie die UTC-Zeit aus einer gegebenen Zeichenkette ermitteln wollen und das Glück haben, in einer Region der Welt zu sein, in der entweder keine Sommerzeit gilt oder Sie Daten haben, die nur von der UTC-Zeit abweichen, ohne dass die Sommerzeit angewendet wird:

--> Verwendung der Ortszeit als Grundlage für den Offset-Wert:

>>> # Obtain the UTC Offset for the current system:
>>> UTC_OFFSET_TIMEDELTA = datetime.datetime.utcnow() - datetime.datetime.now()
>>> local_datetime = datetime.datetime.strptime("2008-09-17 14:04:00", "%Y-%m-%d %H:%M:%S")
>>> result_utc_datetime = local_datetime + UTC_OFFSET_TIMEDELTA
>>> result_utc_datetime.strftime("%Y-%m-%d %H:%M:%S")
'2008-09-17 04:04:00'

--> Oder von einem bekannten Offset aus mit datetime.timedelta():

>>> UTC_OFFSET = 10
>>> result_utc_datetime = local_datetime - datetime.timedelta(hours=UTC_OFFSET)
>>> result_utc_datetime.strftime("%Y-%m-%d %H:%M:%S")
'2008-09-17 04:04:00'

UPDATE:

Seit Python 3.2 datetime.timezone verfügbar ist. Sie können ein zeitzonenabhängiges Datetime-Objekt mit dem folgenden Befehl erzeugen:

import datetime

timezone_aware_dt = datetime.datetime.now(datetime.timezone.utc)

Wenn Sie bereit sind, sich mit Zeitzonenumstellungen zu befassen, lesen Sie dies:

https://medium.com/@eleroy/10-dinge-die-man-wissen-muss-über-datum-und-zeit-in-python-mit-datenzeit-pytz-dateutil-timedelta-309bfbafb3f7

71voto

Tom Punkte 39526

Danke @rofly, die vollständige Konvertierung von String zu String ist wie folgt:

time.strftime("%Y-%m-%d %H:%M:%S", 
              time.gmtime(time.mktime(time.strptime("2008-09-17 14:04:00", 
                                                    "%Y-%m-%d %H:%M:%S"))))

Meine Zusammenfassung der time / calendar Funktionen:

time.strptime
string --> tuple (keine Zeitzone angewendet, entspricht also string)

time.mktime
Ortszeit-Tupel --> Sekunden seit Epoche (immer Ortszeit)

time.gmtime
Sekunden seit Epoche --> Tupel in UTC

calendar.timegm
Tupel in UTC --> Sekunden seit Epoche

time.localtime
Sekunden seit Epoche --> Tupel in lokaler Zeitzone

44voto

FObersteiner Punkte 16343

Eine Option, die seit Python 3.6 verfügbar ist: datetime.astimezone(tz=None) kann verwendet werden, um ein bewusstes datetime-Objekt zu erhalten, das die lokale Zeit darstellt (docs) . Diese kann dann leicht in UTC umgerechnet werden.

from datetime import datetime, timezone
s = "2008-09-17 14:02:00"

# to datetime object:
dt = datetime.fromisoformat(s) # Python 3.7

# I'm on time zone Europe/Berlin; CEST/UTC+2 during summer 2008
dt = dt.astimezone()
print(dt)
# 2008-09-17 14:02:00+02:00

# ...and to UTC:
dtutc = dt.astimezone(timezone.utc)
print(dtutc)
# 2008-09-17 12:02:00+00:00

Nebenbemerkung: Die beschriebene Umstellung auf UTC funktioniert zwar einwandfrei, .astimezone() setzt tzinfo des datetime-Objekts auf eine von timedelta abgeleitete Zeitzone - erwarten Sie also keine "Sommerzeitkenntnisse".

40voto

akaihola Punkte 25244

Hier eine Zusammenfassung der in Python üblichen Zeitumrechnungen.

Einige Methoden geben Bruchteile von Sekunden an und sind mit (s) . Eine explizite Formel wie ts = (d - epoch) / unit kann stattdessen verwendet werden (danke jfs).

  • struct_time (UTC) POSIX (s) :
    calendar.timegm(struct_time)
  • Naïve datetime (lokal) POSIX (s) :
    calendar.timegm(stz.localize(dt, is_dst=None).utctimetuple())
    (Ausnahme bei Sommerzeitumstellung, siehe Kommentar von jfs)
  • Naïve datetime (UTC) POSIX (s) :
    calendar.timegm(dt.utctimetuple())
  • Aware datetime POSIX (s) :
    calendar.timegm(dt.utctimetuple())
  • POSIX struct_time (UTC, s ):
    time.gmtime(t)
    (siehe Kommentar von jfs)
  • Naïve datetime (lokal) struct_time (UTC, s ):
    stz.localize(dt, is_dst=None).utctimetuple()
    (Ausnahme bei Sommerzeitumstellung, siehe Kommentar von jfs)
  • Naïve datetime (UTC) struct_time (UTC, s ):
    dt.utctimetuple()
  • Aware datetime struct_time (UTC, s ):
    dt.utctimetuple()
  • POSIX Naïve datetime (lokal):
    datetime.fromtimestamp(t, None)
    (kann unter bestimmten Bedingungen fehlschlagen, siehe Kommentar von jfs unten)
  • struct_time (UTC) Naïve datetime (local, s ):
    datetime.datetime(struct_time[:6], tzinfo=UTC).astimezone(tz).replace(tzinfo=None)
    (kann keine Schaltsekunden darstellen, siehe Kommentar von jfs)
  • Naïve datetime (UTC) Naïve datetime (local):
    dt.replace(tzinfo=UTC).astimezone(tz).replace(tzinfo=None)
  • Aware datetime Naïve datetime (lokal):
    dt.astimezone(tz).replace(tzinfo=None)
  • POSIX Naïve datetime (UTC):
    datetime.utcfromtimestamp(t)
  • struct_time (UTC) Naïve datetime (UTC, s ):
    datetime.datetime(*struct_time[:6])
    (kann keine Schaltsekunden darstellen, siehe Kommentar von jfs)
  • Naïve datetime (lokal) Naïve datetime (UTC):
    stz.localize(dt, is_dst=None).astimezone(UTC).replace(tzinfo=None)
    (Ausnahme bei Sommerzeitumstellung, siehe Kommentar von jfs)
  • Aware datetime Naïve datetime (UTC):
    dt.astimezone(UTC).replace(tzinfo=None)
  • POSIX Aware datetime:
    datetime.fromtimestamp(t, tz)
    (kann bei Zeitzonen, die nicht zu pytz gehören, fehlschlagen)
  • struct_time (UTC) Aware datetime (s) :
    datetime.datetime(struct_time[:6], tzinfo=UTC).astimezone(tz)
    (kann keine Schaltsekunden darstellen, siehe Kommentar von jfs)
  • Naïve datetime (lokal) Aware datetime:
    stz.localize(dt, is_dst=None)
    (Ausnahme bei Sommerzeitumstellung, siehe Kommentar von jfs)
  • Naïve datetime (UTC) Aware datetime:
    dt.replace(tzinfo=UTC)

Quelle: taaviburns.ca

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X