it-swarm-eu.dev

Wie konvertiere ich in Python die Ortszeit in UTC?

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.

248
Tom

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

60
Tom

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")
221
John Millikin

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:

https://medium.com/@eleroy/10-things-you-need-to-know-about-date-and-time-in-python-with-datetime-pytz-dateutil-timedelta-309bfbafb3f7

123
monkut

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

  • struct_time (UTC) → POSIX (s) :
    calendar.timegm(struct_time)
  • Naive datetime (lokal) → POSIX (s) :
    calendar.timegm(stz.localize(dt, is_dst=None).utctimetuple())
    (Ausnahme bei DST-Übergängen, siehe Kommentar von jfs)
  • Naive Datumszeit (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)
  • Naive datetime (local) → struct_time (UTC, s ):
    stz.localize(dt, is_dst=None).utctimetuple()
    (Ausnahme bei DST-Übergängen, siehe Kommentar von jfs)
  • Naive Datumszeit (UTC) → Strukturzeit (UTC, s ):
    dt.utctimetuple()
  • Aware datetime → struct_time (UTC, s ):
    dt.utctimetuple()
  • POSIX → Naive Datumszeit (lokal):
    datetime.fromtimestamp(t, None)
    (kann unter bestimmten Bedingungen fehlschlagen, siehe Kommentar von jfs unten)
  • struct_time (UTC) → Naive datetime (local, s ):
    datetime.datetime(struct_time[:6], tzinfo=UTC).astimezone(tz).replace(tzinfo=None)
    (kann keine Schaltsekunden darstellen, siehe Kommentar von jfs)
  • Naive Datumszeit (UTC) → Naive Datumszeit (lokal):
    dt.replace(tzinfo=UTC).astimezone(tz).replace(tzinfo=None)
  • Aware datetime → Naive datetime (lokal):
    dt.astimezone(tz).replace(tzinfo=None)
  • POSIX → Naive Datumszeit (UTC):
    datetime.utcfromtimestamp(t)
  • struct_time (UTC) → Naive datetime (UTC, s ):
    datetime.datetime(*struct_time[:6])
    (kann keine Schaltsekunden darstellen, siehe Kommentar von jfs)
  • Naive Datumszeit (lokal) → Naive Datumszeit (UTC):
    stz.localize(dt, is_dst=None).astimezone(UTC).replace(tzinfo=None)
    (Ausnahme bei DST-Übergängen, siehe Kommentar von jfs)
  • Aware datetime → Naive datetime (UTC):
    dt.astimezone(UTC).replace(tzinfo=None)
  • POSIX → Aware datetime:
    datetime.fromtimestamp(t, tz)
    (kann für Nicht-Pytz-Zeitzonen fehlschlagen)
  • struct_time (UTC) → Aware datetime (s) :
    datetime.datetime(struct_time[:6], tzinfo=UTC).astimezone(tz)
    (kann keine Schaltsekunden darstellen, siehe Kommentar von jfs)
  • Naive datetime (lokal) → Aware datetime:
    stz.localize(dt, is_dst=None)
    (Ausnahme bei DST-Übergängen, siehe Kommentar von jfs)
  • Naive Datumszeit (UTC) → Aware Datumszeit:
    dt.replace(tzinfo=UTC)

Quelle: taaviburns.ca

34
akaihola
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())
23
Chuck Callebs

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.

18
Yarin

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

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
12
Shu Wu
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'
7
Scipythonee

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

Sie können es mit:

>>> from time import strftime, gmtime, localtime
>>> strftime('%H:%M:%S', gmtime()) #UTC time
>>> strftime('%H:%M:%S', localtime()) # localtime
4

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>)
2
Dantalion

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.

2
Anonymous fool

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

2
Yash

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

Phantasie Umsetzung

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
1
uclatommy

In Python3:

pip install python-dateutil

from dateutil.parser import tz

mydt.astimezone(tz.gettz('UTC')).replace(tzinfo=None) 
0
spedy

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.

0
franksands