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.

War es hilfreich?

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:

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

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)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top