Wie lokale Zeit Zeichenfolge UTC konvertieren?
Frage
Wie konvertiere ich eine Datetime string in Ortszeit a string in UTC-Zeit
Ich bin sicher, dass ich diese vorher getan haben, aber kann es nicht finden und so wird mir hoffentlich helfen (und andere) zu tun, dass in der Zukunft.
Klarstellung : Zum Beispiel, wenn ich in meiner lokalen Zeitzone (2008-09-17 14:02:00
) +10
habe, ich mag eine Zeichenfolge mit der äquivalent UTC
Zeit erzeugen. 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, wie bei DST und anderen Fragen gibt es keine eindeutige Umwandlung von Ortszeit in UTC-Zeit ist.
Lösung 3
Danke @rofly, ist die vollständige Umwandlung von String-String 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 -> Tupel (keine Zeitzone angewendet wird, so entspricht string)
time.mktime
Ortszeit Tupel -> Sekunden seit Epoche (immer Ortszeit)
time.gmtime
seit Epoche Sekunden -> Tupel in UTC
und
calendar.timegm
Tupel in UTC -> Sekunden seit Epoche
time.localtime
seit Epoche Sekunden -> Tupel in lokaler Zeitzone
Andere Tipps
Zunächst analysiert die Zeichenfolge in ein naives Datetime-Objekt. Dies ist ein Beispiel von datetime.datetime
ohne angebracht Zeitzoneninformationen. Siehe Dokumentation für datetime.strptime
Informationen zum Parsen des Datums-String.
Mit dem pytz
-Modul, das von Zeitzonen + UTC mit einer vollständigen Liste kommt. Finde heraus, was die lokale Zeitzone ist, baut eine Zeitzone Objekt von ihm, und manipulieren, und verbinden Sie es mit dem naiven Datetime.
Schließlich verwendet datetime.astimezone()
Methode, um die Datetime UTC zu konvertieren.
Der Quellcode, mit lokaler Zeitzone "Amerika / Los_Angeles", für die Zeichenfolge "2001.02.03 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 Datetime-Format je nach Bedarf:
utc_dt.strftime ("%Y-%m-%d %H:%M:%S")
Der Datetime-Modul UtcNow () kann Funktion sein verwendet, um die aktuelle UTC-Zeit zu erhalten.
>>> import datetime
>>> utc_datetime = datetime.datetime.utcnow()
>>> utc_datetime.strftime("%Y-%m-%d %H:%M:%S")
'2010-02-01 06:59:19'
Als Link oben von Tom erwähnt: http: // lucumr.pocoo.org/2011/7/15/eppur-si-muove/ sagt:
UTC ist eine Zeitzone ohne Sommerzeit und noch eine Zeitzone ohne Konfigurationsänderungen in der Vergangenheit.
immer messen und zu speichern Zeit in UTC .
Wenn Sie aufzeichnen, wo die Zeit genommen wurde, zu speichern, die getrennt. Do not speichert die lokale Zeit + Zeitzone Informationen!
Hinweis . - Wenn alle Ihre Daten in einem Bereich ist, die DST verwendet, pytz
verwenden und einen Blick auf John Millikin Antwort nehmen
Wenn Sie die UTC-Zeit von einer bestimmten Zeichenfolge erhalten mögen, und Ihr Glück, in einer Region in der Welt sein, dass entweder nicht DST verwenden, oder Sie haben Daten, die nur von der UTC-Offset wird ohne DST angewandt:
-> unter Verwendung lokale Zeit 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, 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:
Da Python 3.2 datetime.timezone
zur Verfügung steht. Sie können eine Zeitzone bewusst Datetime-Objekt mit dem Befehl erzeugen unter:
import datetime
timezone_aware_dt = datetime.datetime.now(datetime.timezone.utc)
Wenn Ihr bereit, auf Zeitzone Conversions nehmen gehen lesen:
Hier ist eine Zusammenfassung der gemeinsamen Python Zeit Konvertierungen.
Einige Methoden Bruchteile von Sekunden fallen, und sind gekennzeichnet mit (n) . Eine explizite Formel wie ts = (d - epoch) / unit
kann stattdessen verwendet werden (dank JFS).
- struct_time (UTC) → POSIX (n) :
calendar.timegm(struct_time)
- Naïve Datetime (local) → POSIX (n) :
calendar.timegm(stz.localize(dt, is_dst=None).utctimetuple())
(Ausnahme bei DST-Übergänge, siehe Kommentar von JFS) - Naïve Datumzeit (UTC) → POSIX (n) :
calendar.timegm(dt.utctimetuple())
- Aware Datetime → POSIX (n) :
calendar.timegm(dt.utctimetuple())
- POSIX → struct_time (UTC, s ):
time.gmtime(t)
(siehe Kommentar von JFS) - Naïve Datetime (local) → struct_time (UTC, s ):
stz.localize(dt, is_dst=None).utctimetuple()
(Ausnahme bei DST-Übergänge, siehe Kommentar von JFS) - Naïve Datumzeit (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, lesen Kommentar von JFS unten) - struct_time (UTC) → Naïve Datetime (lokal, s ):
datetime.datetime(struct_time[:6], tzinfo=UTC).astimezone(tz).replace(tzinfo=None)
(nicht Schaltsekunden darstellen, siehe Kommentar von JFS) - Naïve Datumzeit (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 Datumzeit (UTC):
datetime.utcfromtimestamp(t)
- struct_time (UTC) → Naïve Datumzeit (UTC, s ):
datetime.datetime(*struct_time[:6])
(nicht Schaltsekunden darstellen, siehe Kommentar von JFS) - Naïve Datetime (local) → Naïve Datumzeit (UTC):
stz.localize(dt, is_dst=None).astimezone(UTC).replace(tzinfo=None)
(Ausnahme bei DST-Übergängen, siehe Kommentar von JFS) - Aware Datetime → Naïve Datumzeit (UTC):
dt.astimezone(UTC).replace(tzinfo=None)
- POSIX → Aware Datetime:
datetime.fromtimestamp(t, tz)
(kann für nicht-pytz Zeitzonen gescheitert) - struct_time (UTC) → Aware Datetime (n) :
datetime.datetime(struct_time[:6], tzinfo=UTC).astimezone(tz)
(nicht Schaltsekunden darstellen, siehe Kommentar von JFS) - Naïve Datetime (local) → Aware Datetime:
stz.localize(dt, is_dst=None)
(Ausnahme bei DST-Übergänge, siehe Kommentar von JFS) - Naïve Datumzeit (UTC) → Aware Datetime:
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 / Umwandlung-von-local-time-to-utc.html
Beispiel für die Verwendung von bd808 : Wenn die Quelle ein datetime.datetime
Objekt t
ist, rufen wie:
local_to_utc(t.timetuple())
Ich habe viel Glück mit dateutil (die weit über SO für andere ähnliche Fragen wird empfohlen) :
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')
(Code wurde von dieser Antwort abgeleitet UTC Datetime-Zeichenfolge konvertieren zu lokalen Datetime )
Ein weiteres Beispiel mit pytz, sondern umfasst lokalisieren (), die meinen Tag gerettet.
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 habe den größten Erfolg mit python-dateutil hat:
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 es vorziehen, datetime.datetime:
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
Wie wäre es -
time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime(seconds))
Wenn Sekunden None
sind dann wandelt sie die lokale Zeit in UTC-Zeit sonst die in der Zeit zu UTC weitergegeben konvertiert.
Einfache
Ich habe es wie folgt aus:
>>> 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
Phantasie Implementierung
Wenn Sie Lust bekommen möchten, können Sie diese in eine Funktors drehen:
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
Für rund Tageslichtspar bekommen, etc.
Keine der oben genannten Antworten besonders hat mir geholfen. Der folgende Code funktioniert für GMT.
def get_utc_from_local(date_time, local_tz=None):
assert date_time.__class__.__name__ == '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>)
Mit 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:)
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 verwendet nur Python integrierte Bibliotheken und nicht Sie zur Eingabe Ihrer lokale Zeitzone erfordern (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 bin reposting hier die Antwort da diese Frage anstelle der verknüpften Frage in Google erscheint je nach den Suchbegriffen.
in diesem Fall ... pytz ist am besten lib
import pytz
utc = pytz.utc
yourdate = datetime.datetime.now()
yourdateutc = yourdate.astimezone(utc).replace(tzinfo=None)