Wie konvertiere ich eine lokale Zeitzeichenfolge in UTC?

307

Wie konvertiere ich eine Datums- / Uhrzeitzeichenfolge in Ortszeit in eine Zeichenfolge in UTC-Zeit ?

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

Erläuterung : Wenn ich beispielsweise 2008-09-17 14:02:00in meiner lokalen Zeitzone ( +10) habe, möchte ich eine Zeichenfolge mit der entsprechenden UTCZeit generieren : 2008-09-17 04:02:00.

Beachten Sie außerdem unter http://lucumr.pocoo.org/2011/7/15/eppur-si-muove/ , dass dies im Allgemeinen nicht möglich ist, da bei Sommerzeit und anderen Problemen keine eindeutige Konvertierung von Ortszeit zu erfolgt UTC-Zeit.

Tom
quelle
1
Bitte beachten Sie, dass die mktime () -Methode eine "Ortszeit" als Eingabe verwendet, die möglicherweise nicht Ihren Erwartungen entspricht. Ich habe sie verwendet und alles durcheinander gebracht. Bitte werfen Sie einen Blick auf diesen Link
Haifeng Zhang

Antworten:

287

Analysieren Sie zunächst die Zeichenfolge in ein naives datetime-Objekt. Dies ist eine Instanz datetime.datetimeohne angehängte Zeitzoneninformationen. Siehe Dokumentation fürdatetime.strptimeInformationen zum Parsen der Datumszeichenfolge finden .

Verwenden Sie die pytz Modul, das eine vollständige Liste der Zeitzonen + UTC enthält. Finden Sie heraus, was die lokale Zeitzone ist, erstellen Sie daraus ein Zeitzonenobjekt und bearbeiten Sie es und hängen Sie es an die naive Datumszeit an.

Schließlich verwenden datetime.astimezone() Methode, um die Datums- und Uhrzeitangabe in UTC zu konvertieren.

Quellcode unter Verwendung 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")
John Millikin
quelle
7
Bitte bearbeiten Sie Ihre Antwort mit dem folgenden Code: [code] local.localize (naive) [/ code] Siehe Dokument: link Leider funktioniert die Verwendung des tzinfo-Arguments der Standard-Datetime-Konstruktoren für pytz in vielen Zeitzonen nicht. >>> datetime (2002, 10, 27, 12, 0, 0, tzinfo = amsterdam) .strftime (fmt) '27 27.10.2002 12:00:00 AMT + 0020 '
Sam Stoelinga
2
Anscheinend erweist sich der Schritt "Herausfinden, was die lokale Zeitzone ist" als schwieriger als es sich anhört (praktisch unmöglich).
Jason R. Coombs
2
Verwenden Sie die von @SamStoelinga vorgeschlagene Datei local.localize, da Sie sonst die Sommerzeit nicht berücksichtigen.
Emil Stenström
Diese Antwort war für mich sehr hilfreich, aber ich möchte auf eine Falle hinweisen, auf die ich gestoßen bin. Wenn Sie die Uhrzeit, aber nicht das Datum angeben, erhalten Sie möglicherweise unerwartete Ergebnisse. Stellen Sie also sicher, dass Sie einen vollständigen Zeitstempel angeben.
Steven Mercatante
145

Mit der Funktion utcnow () des datetime-Moduls kann die aktuelle UTC-Zeit abgerufen 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 von Tom erwähnte Link: 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 aufzeichnen müssen, wo die Zeit genommen wurde, speichern Sie diese separat. Speichern Sie nicht die Ortszeit + Zeitzoneninformationen!

HINWEIS - Wenn sich Ihre Daten in einer Region befinden, in der die Sommerzeit verwendet wird, verwenden Siepytz die Antwort von John Millikin und sehen Sie sich diese an.

Wenn Sie die UTC-Zeit aus einer bestimmten Zeichenfolge abrufen möchten und das Glück haben, in einer Region auf der Welt zu sein, in der entweder keine Sommerzeit verwendet wird oder Daten nur von der UTC versetzt sind, ohne dass die Sommerzeit angewendet wird:

-> Ortszeit als Basis für den Offsetwert verwenden:

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

Da ist Python 3.2 datetime.timezoneverfügbar. Mit dem folgenden Befehl können Sie ein zeitzonenbewusstes Datum / Uhrzeit-Objekt 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

Mönch
quelle
14
Das konvertiert nur die aktuelle Zeit, ich muss eine bestimmte Zeit (als Zeichenfolge) nehmen und in UTC konvertieren.
Tom
Ich denke nicht, dass es hier wichtig sein sollte, wenn Sie Standard-Offset-Werte verwenden. local_time = utc_time + utc_offset AND utc_time = local_time - utc_offset.
Mönch
5
Es funktioniert nur mit der aktuellen Zeit, da vergangene und zukünftige Zeitstempel aufgrund der Sommerzeit unterschiedliche UTC-Offsets haben können.
Alex B
Guter Punkt ... wenn Sie sich mit der Sommerzeit befassen müssen, sollten Sie wahrscheinlich Pytz verwenden, wie von John Millikin erwähnt.
Mönch
1
Zwischen den Aufrufen von utcnow () und now () besteht ein sporadisches Delta. Das ist eine gefährliche Codezeile, die später zu seltsamen Fehlern führen kann tzinfo.utcoffset() must return a whole number of minutes.
Pavel Vlasov
62

Dank @rofly ist die vollständige Konvertierung von String zu 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/ calendarFunktionen:

time.strptime
Zeichenfolge -> Tupel (keine Zeitzone angewendet, entspricht also Zeichenfolge)

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

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

und

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

time.localtime
Sekunden seit der Epoche -> Tupel in der lokalen Zeitzone

Tom
quelle
4
(always local time)scheint falsch zu sein: Die Eingabe in mktime () ist Ortszeit, die Ausgabe ist Sekunden seit epoch ( 1970-01-01 00:00:00 +0000 (UTC)), die nicht von der Zeitzone abhängt.
JFS
3
Außerdem besteht eine 50% ige Wahrscheinlichkeit, dass es während des DST-Übergangs fehlschlägt. Siehe Probleme mit Localtime
jfs
38

Hier ist eine Zusammenfassung der gängigen Python-Zeitkonvertierungen.

Einige Methoden lassen Sekundenbruchteile fallen und sind mit (s) gekennzeichnet . Eine explizite Formel, wie ts = (d - epoch) / unitsie stattdessen verwendet werden kann (danke jfs).

  • struct_time (UTC) → POSIX (s) :
    calendar.timegm(struct_time)
  • Naive Datumszeit (lokal) → POSIX (s) :
    calendar.timegm(stz.localize(dt, is_dst=None).utctimetuple())
    (Ausnahme bei Sommerzeitübergängen, siehe Kommentar von jfs)
  • Naive Datumszeit (UTC) → POSIX (s) :
    calendar.timegm(dt.utctimetuple())
  • Bewusstes Datum / Uhrzeit → POSIX (s) :
    calendar.timegm(dt.utctimetuple())
  • POSIX → struct_time (UTC, s ):
    time.gmtime(t)
    (siehe Kommentar von jfs)
  • Naive Datumszeit (lokal) → struct_time (UTC, s ):
    stz.localize(dt, is_dst=None).utctimetuple()
    (Ausnahme bei Sommerzeitübergängen, siehe Kommentar von jfs)
  • Naive Datumszeit (UTC) → struct_time (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 Datumszeit (lokal, s ):
    datetime.datetime(struct_time[:6], tzinfo=UTC).astimezone(tz).replace(tzinfo=None)
    (kann keine darstellen, siehe Kommentar von jfs)
  • Naive Datumszeit (UTC) → Naive Datumszeit (lokal):
    dt.replace(tzinfo=UTC).astimezone(tz).replace(tzinfo=None)
  • Bewusste Datumszeit → Naive Datumszeit (lokal):
    dt.astimezone(tz).replace(tzinfo=None)
  • POSIX → Naive Datumszeit (UTC):
    datetime.utcfromtimestamp(t)
  • struct_time (UTC) → Naive Datumszeit (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)
  • Bewusste Datumszeit → Naive Datumszeit (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 darstellen, siehe Kommentar von jfs)
  • Naive Datumszeit (lokal) → Bewusste Datumszeit:
    stz.localize(dt, is_dst=None)
    (Ausnahme bei Sommerzeitübergängen, siehe Kommentar von jfs)
  • Naive Datumszeit (UTC) → Bewusste Datumszeit:
    dt.replace(tzinfo=UTC)

Quelle: taaviburns.ca

Akaihola
quelle
1
(1) fromtimestamp(t, None)kann fehlschlagen, wenn die lokale Zeitzone einen anderen utc-Offset hatte t und die C-Bibliothek keinen Zugriff auf die tz-Datenbank auf der angegebenen Plattform hat. Sie können tzlocal.get_localzone()tzdata auf tragbare Weise bereitstellen. (2) fromtimestamp(t, tz)kann für Nicht-Pytz-Zeitzonen fehlschlagen. (3) datetime(*struct_time[:6])Sie fehlen *. (4) timegm(), utctimetuple(), struct_timeDrop -basierten Lösungen von Bruchteilen einer Sekunde. Sie können ts = (d - epoch) / unitstattdessen eine explizite Formel wie: verwenden.
JFS
1
(5) stz.localize(dt, is_dst=None)löst eine Ausnahme für mehrdeutige oder nicht vorhandene Ortszeiten aus, z. B. während der Sommerzeitübergänge. Verwenden Sie stz.normalize(stz.localize(dt))diese Option, um die Ausnahme zu vermeiden. Dies kann zu ungenauen Ergebnissen führen. (6) datetime () kann keine Schaltsekunde darstellen. Konvertieren Sie struct_timezuerst als Problemumgehung in "Sekunden seit der Epoche". (7) Im time.gmtime(t)Gegensatz zu calendar.timegm()möglicherweise wird eine Nicht-POSIX-Eingabe erwartet, wenn die "richtige" Zeitzone verwendet wird. Verwenden Sie die explizite Formel, wenn die Eingabe stattdessen POSIX ist:gmtime = lambda t: datetime(1970,1,1, tzinfo=utc) + timedelta(seconds=t)
jfs
Ich wünschte, dies wäre in einer Tabelle, leichter zu lesen (es ist im Link)
MichaelChirico
1
@MichaelChirico, in dieser Antwort heißt es: "Wir erlauben (und werden) keine <table>Tags. Entschuldigung. Dies ist beabsichtigt und beabsichtigt. Wenn Sie eine schnelle und schmutzige" Tabelle "benötigen, verwenden Sie ein <pre>ASCII-Layout." Ich glaube nicht, dass eine ASCII-Tabelle besser lesbar wäre als die obige Liste.
Akaihola
Nun, das ist unglücklich. Sie haben sowieso meine Gegenstimme ... vielleicht verweisen Sie auf die Tabelle im Link in Ihrer Antwort?
MichaelChirico
25
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

Anwendungsbeispiel von bd808 : Wenn Ihre Quelle ein datetime.datetimeObjekt ist t, rufen Sie Folgendes auf :

local_to_utc(t.timetuple())
Chuck Callebs
quelle
5
Wenn Ihre Quelle ein datetime.datetime-Objekt ist t, rufen Sie Folgendes auf: local_to_utc (t.timetuple ())
bd808
2
.timetuple()Anruf setzt tm_isdstauf -1; mktime()Während des DST-Übergangs besteht eine 50% ige Wahrscheinlichkeit, dass ein Fehler auftritt.
JFS
1
Die Lösung von Chuck verliert Millisekundeninformationen.
Luca
21

Ich habe viel Glück mit Dateutil (das 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 aus dieser Antwort zum Konvertieren der UTC-Datums- / Uhrzeitzeichenfolge in die lokale Datums- / Uhrzeitangabe abgeleitet. )

Yarin
quelle
dateutilkann für vergangene Daten fehlschlagen, wenn die lokale Zeitzone auf Systemen, auf denen die Implementierung keine historische Zeitzonendatenbank verwendet (insbesondere Windows), einen anderen UTC-Offset als (unabhängig von den Sommerzeitübergängen) hatte. pytz+ tzlocalkönnte stattdessen verwendet werden.
JFS
@ JFSebastian- Hatte noch nichts davon gehört - wo können wir mehr Infos bekommen?
Yarin
Nehmen Sie einen Windows-Computer, stellen Sie eine Zeitzone ein, die in der Vergangenheit einen anderen UTC-Offset hatte, z. B. Europa / Moskau. Vergleichen Sie die Ergebnisse mit Pytz . Außerdem können Sie diesen Fehler testen, der selbst unter Ubuntu fehlschlägt, obwohl ich mir in diesem Fall nicht sicher bin, ob die API korrekt verwendet wird.
JFS
Was ist die Ausgabe? Bitte posten Sie die Ausgabe.
not2qubit
18

Ein weiteres Beispiel mit pytz, enthält aber 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'
Paulius Sladkevičius
quelle
12

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
Shu Wu
quelle
7
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'
Scipythonee
quelle
mktime(dt.timetuple())kann während des DST-Übergangs fehlschlagen . Es gibt LocalTimezonein den Dokumenten (es funktioniert für die neueste Zeitzonendefinition, kann aber für vergangene Daten fehlschlagen (nicht im Zusammenhang mit der Sommerzeit))
jfs
5

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")
user235042
quelle
1
Sicher, aber ich kann nicht verstehen, warum Sie das vorziehen würden. Es erfordert einen zusätzlichen Import und 3 weitere Funktionsaufrufe als meine Version ...
Tom
% Z und% z drucken noch Leerzeichen.
Pavel Vlasov
2
es ist falsch. Es schlägt fehl, wenn die lokale Zeitzone nicht UTC ist. mktime()erwartet Ortszeit als Eingabe. fromtimestamp()Gibt die Ortszeit zurück, nicht utc. Wenn Sie es beheben, sehen Sie diese zusätzlichen Probleme (wie dateutil, stdlib-only-Lösung kann fehlschlagen)
jfs
5

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

Ausgefallene Implementierung

Wenn Sie Lust haben, können Sie daraus einen Funktor 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
Uclatommy
quelle
5
Dies funktioniert nicht für die Sommerzeit - z. B. wenn es gerade Sommer ist und das Konvertierungsdatum im Winter liegt. und die Frage war über das Konvertieren von als Zeichenfolgen gespeicherten Daten ...
Tom
1
Zu Ihrer Information. Das größte Problem bei dieser Methode (neben der Sommerzeit) sind die wenigen Millisekunden, um die das Delta ausgeschaltet sein wird. Alle meine Kalendereinladungen werden um 1 Minute als deaktiviert angezeigt.
Nostalg.io
4

Sie können es tun mit:

>>> from time import strftime, gmtime, localtime
>>> strftime('%H:%M:%S', gmtime()) #UTC time
>>> strftime('%H:%M:%S', localtime()) # localtime
Cristian Salamea
quelle
3

Wie wäre es mit -

time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime(seconds))

Wenn Sekunden sind None, wird die Ortszeit in UTC-Zeit konvertiert, andernfalls wird die übergebene Zeit in UTC konvertiert.

Tom
quelle
2

Um die Sommerzeit usw. zu umgehen

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__.__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>)
Dantalion
quelle
2

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

Yash
quelle
Pfeil ist fantastisch: arrow.get (datetime.now (), 'local'). to ('utc'). naiv
SteveJ
1

Ich habe hier die beste Antwort auf eine andere Frage gefunden . Es werden nur in Python integrierte Bibliotheken verwendet, und Sie müssen keine lokale Zeitzone eingeben (in meinem Fall eine Anforderung).

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 anstelle der verknüpften Frage in Abhängigkeit von den Suchbegriffen angezeigt wird.

Franksands
quelle
1

Ich habe diesen Code in einem meiner Projekte:

from datetime import datetime
## datetime.timezone works in newer versions of python
try:
    from datetime import timezone
    utc_tz = timezone.utc
except:
    import pytz
    utc_tz = pytz.utc

def _to_utc_date_string(ts):
    # type (Union[date,datetime]]) -> str
    """coerce datetimes to UTC (assume localtime if nothing is given)"""
    if (isinstance(ts, datetime)):
        try:
            ## in python 3.6 and higher, ts.astimezone() will assume a
            ## naive timestamp is localtime (and so do we)
            ts = ts.astimezone(utc_tz)
        except:
            ## in python 2.7 and 3.5, ts.astimezone() will fail on
            ## naive timestamps, but we'd like to assume they are
            ## localtime
            import tzlocal
            ts = tzlocal.get_localzone().localize(ts).astimezone(utc_tz)
    return ts.strftime("%Y%m%dT%H%M%SZ")
Tobixen
quelle
0

In Python3:

pip install python-dateutil

from dateutil.parser import tz

mydt.astimezone(tz.gettz('UTC')).replace(tzinfo=None) 
spedy
quelle
Dies scheint nicht zu funktionieren, es löst eine ValueError-Ausnahme aus: ValueError: astimezone () kann nicht auf eine naive Datumszeit angewendet werden
Stormsson
Es sollte sein: from dateutil import tz
Javier
-3

Wie wäre es mit -

time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime(seconds))

Wenn Sekunden sind None, wird die Ortszeit in UTC-Zeit konvertiert, andernfalls wird die übergebene Zeit in UTC konvertiert.

Mohammad Efazati
quelle
1
Dies hilft nicht, die Frage war, eine bestimmte lokale Zeitzeichenfolge in eine utc-Zeichenfolge zu konvertieren.
Tom