Wie konvertiere ich ein datetime String in Ortszeit in ein String in UTC-Zeit?
Ich bin mir sicher, dass ich das schon einmal gemacht habe, aber ich kann es nicht finden und SO wird mir (und anderen) hoffentlich dabei helfen, dies in Zukunft zu tun.
Clarification: Wenn ich beispielsweise 2008-09-17 14:02:00
in meiner lokalen Zeitzone (+10
) habe, möchte ich einen String mit der entsprechenden UTC
Zeit generieren: 2008-09-17 04:02:00
.
In http://lucumr.pocoo.org/2011/7/15/eppur-si-muove/ ist zu beachten, dass dies im Allgemeinen nicht möglich ist, da mit DST und anderen Problemen keine eindeutige Konvertierung möglich ist von der Ortszeit zur UTC-Zeit.
Danke, @rofly, die vollständige Konvertierung von String zu String lautet 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, daher auch Zeichenfolge)
time.mktime
Ortszeit Tuple -> Sekunden seit Epoche (immer Ortszeit)
time.gmtime
Sekunden nach Epoche -> Tuple in UTC
und
calendar.timegm
Tuple in UTC -> Sekunden seit Epoche
time.localtime
Sekunden nach Epoche -> Tuple in der lokalen Zeitzone
Analysieren Sie zuerst den String in ein naives datetime-Objekt. Dies ist eine Instanz von datetime.datetime
ohne angehängte Zeitzoneninformationen. Informationen zur Analyse der Datumszeichenfolge finden Sie in der Dokumentation zu datetime.strptime
.
Verwenden Sie das Modul pytz
, das eine vollständige Liste der Zeitzonen + UTC enthält. Finden Sie heraus, was die lokale Zeitzone ist, konstruieren Sie daraus ein Zeitzonenobjekt, manipulieren Sie es und hängen Sie es an die naive Datumszeit an.
Verwenden Sie schließlich die Methode datetime.astimezone()
, um die Datumszeit in UTC zu konvertieren.
Quellcode mit der lokalen Zeitzone "America/Los_Angeles" für die Zeichenfolge "2001-2-3 10:11:12":
import pytz, datetime
local = pytz.timezone ("America/Los_Angeles")
naive = datetime.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 verwenden, um die UTC-Datumszeit nach Bedarf zu formatieren:
utc_dt.strftime ("%Y-%m-%d %H:%M:%S")
Mit der Funktion tcnow () des datetime-Moduls kann die aktuelle UTC-Zeit ermittelt werden.
>>> 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 erwähnte Link von Tom: http://lucumr.pocoo.org/2011/7/15/eppur-si-muove/ sagt:
UTC ist eine Zeitzone ohne Sommerzeit und dennoch eine Zeitzone ohne Konfigurationsänderungen in der Vergangenheit.
Messen und speichern Sie die Zeit immer in UTC .
Wenn Sie notieren müssen, wo die Zeit genommen wurde, speichern Sie diese separat. Speichern Sie nicht die Ortszeit + Zeitzoneninformation!
NOTE - Wenn sich Ihre Daten in einer Region befinden, in der die Sommerzeit verwendet wird, verwenden Sie pytz
und sehen Sie sich die Antwort von John Millikin an.
Wenn Sie die UTC-Zeit aus einer bestimmten Zeichenfolge abrufen möchten und das Glück haben, sich in einer Region auf der Welt zu befinden, in der entweder keine Sommerzeit verwendet wird, oder Daten vorliegen, die nur gegen UTC versetzt sind, ohne dass die Sommerzeit angewendet wurde:
-> Verwendung der Ortszeit als Basis für den Versatzwert:
>>> # 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 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'
AKTUALISIEREN:
Seit python 3.2 datetime.timezone
verfügbar. Mit dem folgenden Befehl können Sie ein datetime-Objekt mit Zeitzonenerkennung generieren:
import datetime
timezone_aware_dt = datetime.datetime.now(datetime.timezone.utc)
Wenn Sie bereit sind, Zeitzonen-Konvertierungen vorzunehmen, lesen Sie Folgendes:
Hier ist eine Zusammenfassung der üblichen Python Zeitkonvertierungen.
Einige Methoden lassen Sekundenbruchteile fallen und sind mit (s) markiert. Stattdessen kann eine explizite Formel wie ts = (d - Epoch) / unit
verwendet werden (danke jfs).
calendar.timegm(struct_time)
calendar.timegm(stz.localize(dt, is_dst=None).utctimetuple())
calendar.timegm(dt.utctimetuple())
calendar.timegm(dt.utctimetuple())
time.gmtime(t)
stz.localize(dt, is_dst=None).utctimetuple()
dt.utctimetuple()
dt.utctimetuple()
datetime.fromtimestamp(t, None)
datetime.datetime(struct_time[:6], tzinfo=UTC).astimezone(tz).replace(tzinfo=None)
dt.replace(tzinfo=UTC).astimezone(tz).replace(tzinfo=None)
dt.astimezone(tz).replace(tzinfo=None)
datetime.utcfromtimestamp(t)
datetime.datetime(*struct_time[:6])
stz.localize(dt, is_dst=None).astimezone(UTC).replace(tzinfo=None)
dt.astimezone(UTC).replace(tzinfo=None)
datetime.fromtimestamp(t, tz)
datetime.datetime(struct_time[:6], tzinfo=UTC).astimezone(tz)
stz.localize(dt, is_dst=None)
dt.replace(tzinfo=UTC)
Quelle: taaviburns.ca
def local_to_utc(t):
secs = time.mktime(t)
return time.gmtime(secs)
def utc_to_local(t):
secs = calendar.timegm(t)
return time.localtime(secs)
Quelle: http://feihonghsu.blogspot.com/2008/02/converting-from-local-time-to-utc.html
Verwendungsbeispiel aus bd808 : Wenn Ihre Quelle ein datetime.datetime
-Objekt t
ist, rufen Sie wie folgt auf:
local_to_utc(t.timetuple())
Ich habe viel Glück mit dateutil (was auf SO für andere verwandte Fragen allgemein empfohlen wird):
from datetime import *
from dateutil import *
from dateutil.tz import *
# METHOD 1: Hardcode zones:
utc_zone = tz.gettz('UTC')
local_zone = tz.gettz('America/Chicago')
# METHOD 2: Auto-detect zones:
utc_zone = tz.tzutc()
local_zone = tz.tzlocal()
# Convert time string to datetime
local_time = datetime.strptime("2008-09-17 14:02:00", '%Y-%m-%d %H:%M:%S')
# Tell the datetime object that it's in local time zone since
# datetime objects are 'naive' by default
local_time = local_time.replace(tzinfo=local_zone)
# Convert time to UTC
utc_time = local_time.astimezone(utc_zone)
# Generate UTC time string
utc_string = utc_time.strftime('%Y-%m-%d %H:%M:%S')
(Der Code wurde von dieser Antwort in UTC-Datumszeilenzeichenfolge in lokale Datumsangaben konvertiert) abgeleitet.
Ein weiteres Beispiel mit pytz, enthält jedoch localize (), was meinen Tag gerettet hat.
import pytz, datetime
utc = pytz.utc
fmt = '%Y-%m-%d %H:%M:%S'
amsterdam = pytz.timezone('Europe/Amsterdam')
dt = datetime.datetime.strptime("2012-04-06 10:00:00", fmt)
am_dt = amsterdam.localize(dt)
print am_dt.astimezone(utc).strftime(fmt)
'2012-04-06 08:00:00'
Ich hatte den größten Erfolg mit python-dateutil :
from dateutil import tz
def datetime_to_utc(date):
"""Returns date in UTC w/o tzinfo"""
return date.astimezone(tz.gettz('UTC')).replace(tzinfo=None) if date.tzinfo else date
import time
import datetime
def Local2UTC(LocalTime):
EpochSecond = time.mktime(LocalTime.timetuple())
utcTime = datetime.datetime.utcfromtimestamp(EpochSecond)
return utcTime
>>> LocalTime = datetime.datetime.now()
>>> UTCTime = Local2UTC(LocalTime)
>>> LocalTime.ctime()
'Thu Feb 3 22:33:46 2011'
>>> UTCTime.ctime()
'Fri Feb 4 05:33:46 2011'
wenn Sie datetime.datetime bevorzugen:
dt = datetime.strptime("2008-09-17 14:04:00","%Y-%m-%d %H:%M:%S")
utc_struct_time = time.gmtime(time.mktime(dt.timetuple()))
utc_dt = datetime.fromtimestamp(time.mktime(utc_struct_time))
print dt.strftime("%Y-%m-%d %H:%M:%S")
Sie können es mit:
>>> from time import strftime, gmtime, localtime
>>> strftime('%H:%M:%S', gmtime()) #UTC time
>>> strftime('%H:%M:%S', localtime()) # localtime
Für Tageslichteinsparungen usw.
Keine der obigen Antworten hat mir besonders geholfen. Der folgende Code funktioniert für GMT.
def get_utc_from_local(date_time, local_tz=None):
assert date_time.__class__.__== 'datetime'
if local_tz is None:
local_tz = pytz.timezone(settings.TIME_ZONE) # Django eg, "Europe/London"
local_time = local_tz.normalize(local_tz.localize(date_time))
return local_time.astimezone(pytz.utc)
import pytz
from datetime import datetime
summer_11_am = datetime(2011, 7, 1, 11)
get_utc_from_local(summer_11_am)
>>>datetime.datetime(2011, 7, 1, 10, 0, tzinfo=<UTC>)
winter_11_am = datetime(2011, 11, 11, 11)
get_utc_from_local(winter_11_am)
>>>datetime.datetime(2011, 11, 11, 11, 0, tzinfo=<UTC>)
Wie wäre es mit -
time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime(seconds))
wenn Sekunden None
ist, wird die Ortszeit in UTC-Zeit konvertiert, ansonsten wird die verstrichene Zeit in UTC konvertiert.
Verwenden von http://crsmithdev.com/arrow/
arrowObj = arrow.Arrow.strptime('2017-02-20 10:00:00', '%Y-%m-%d %H:%M:%S' , 'US/Eastern')
arrowObj.to('UTC') or arrowObj.to('local')
Diese Bibliothek macht das Leben einfach :)
Ich habe es so gemacht:
>>> utc_delta = datetime.utcnow()-datetime.now()
>>> utc_time = datetime(2008, 9, 17, 14, 2, 0) + utc_delta
>>> print(utc_time)
2008-09-17 19:01:59.999996
Wenn Sie Lust haben wollen, können Sie daraus einen Functor machen:
class to_utc():
utc_delta = datetime.utcnow() - datetime.now()
def __call__(cls, t):
return t + cls.utc_delta
Ergebnis:
>>> utc_converter = to_utc()
>>> print(utc_converter(datetime(2008, 9, 17, 14, 2, 0)))
2008-09-17 19:01:59.999996
In Python3:
pip install python-dateutil
from dateutil.parser import tz
mydt.astimezone(tz.gettz('UTC')).replace(tzinfo=None)
Ich fand die beste Antwort auf eine andere Frage hier . Es werden nur in Python integrierte Bibliotheken verwendet, und Sie müssen nicht Ihre lokale Zeitzone eingeben (eine Anforderung in meinem Fall).
import time
import calendar
local_time = time.strptime("2018-12-13T09:32:00.000", "%Y-%m-%dT%H:%M:%S.%f")
local_seconds = time.mktime(local_time)
utc_time = time.gmtime(local_seconds)
Ich poste die Antwort hier erneut, da diese Frage in Google angezeigt wird und nicht in Abhängigkeit von den Suchbegriffen.