517 Stimmen

Wie erhalte ich einen Wert von datetime.today() in Python, die "timezone aware" ist?

Ich versuche, einen Datumswert von dem Wert von zu subtrahieren datetime.datetime.today() um zu berechnen, wie lange etwas her ist. Aber es beschwert sich:

TypeError: can't subtract offset-naive and offset-aware datetimes

Der Rückgabewert von datetime.datetime.today() scheint nicht "zeitzonenbewusst" zu sein, während mein anderer Datumswert es ist. Wie erhalte ich einen Rückgabewert von datetime.datetime.today() die die Zeitzone berücksichtigt?

Ideal wäre es, wenn das System automatisch die Zeitzone kennen würde.

Im Moment wird mir die Zeit in Ortszeit angezeigt, die zufällig PST ist, d. h. UTC - 8 Stunden. Gibt es im schlimmsten Fall eine Möglichkeit, eine Zeitzone manuell in das Feld datetime Objekt zurückgegeben von datetime.datetime.today() und sie auf UTC-8 einstellen?

20voto

Dariusz Walczak Punkte 4618

Eine weitere Methode, um ein zeitzonenabhängiges datetime-Objekt zu erstellen, das die aktuelle Zeit darstellt:

import datetime
import pytz

pytz.utc.localize( datetime.datetime.utcnow() )  

Sie können Folgendes installieren pytz von PyPI durch Ausführen:

$ pipenv install pytz

11voto

laffuste Punkte 14777

Wenn Sie Folgendes verwenden Django können Sie nicht-tz-bewusste Daten einstellen (nur UTC ).

Kommentar die folgende Zeile in settings.py:

USE_TZ = True

10voto

G. Führ Punkte 401

Verwenden Sie dateutil wie in Python datetime.datetime.now(), die die Zeitzone berücksichtigt :

from dateutil.tz import tzlocal
# Get the current date/time with the timezone.
now = datetime.datetime.now(tzlocal())

9voto

FObersteiner Punkte 16343

Es sollte betont werden, dass Sie seit Python 3.6 nur noch die Standard-Lib benötigen, um ein zeitzonenbewusstes datetime-Objekt zu erhalten, das die lokale Zeit (die Einstellung Ihres Betriebssystems) darstellt. verwenden astimezone()

import datetime

datetime.datetime(2010, 12, 25, 10, 59).astimezone()
# e.g.
# datetime.datetime(2010, 12, 25, 10, 59, tzinfo=datetime.timezone(datetime.timedelta(seconds=3600), 'Mitteleuropäische Zeit'))

datetime.datetime(2010, 12, 25, 12, 59).astimezone().isoformat()
# e.g.
# '2010-12-25T12:59:00+01:00'

# I'm on CET/CEST

(siehe den Kommentar von @johnchen902). Es gibt allerdings einen kleinen Vorbehalt, astimezone(None) gibt bewusste Datumszeit, ohne Berücksichtigung von DST .

9voto

jcazor Punkte 113

Hier ist eine Möglichkeit, sie mit der stdlib zu erzeugen:

import time
from datetime import datetime

FORMAT='%Y-%m-%dT%H:%M:%S%z'
date=datetime.strptime(time.strftime(FORMAT, time.localtime()),FORMAT)

Datum speichert das lokale Datum und die Abweichung von UTC und nicht das Datum in der UTC-Zeitzone, so dass Sie diese Lösung verwenden können, wenn Sie die in welcher Zeitzone das Datum erzeugt wird . In diesem Beispiel und in meiner lokalen Zeitzone:

date
datetime.datetime(2017, 8, 1, 12, 15, 44, tzinfo=datetime.timezone(datetime.timedelta(0, 7200)))

date.tzname()
'UTC+02:00'

Der Schlüssel ist das Hinzufügen der %z zur Darstellung FORMAT, um den UTC-Offset der erzeugten Zeitstruktur anzugeben. Andere Darstellungsformate können im datetime-Modul nachgeschlagen werden docs

Wenn Sie das Datum in der UTC-Zeitzone benötigen, können Sie die time.localtime() con time.gmtime()

date=datetime.strptime(time.strftime(FORMAT, time.gmtime()),FORMAT)

date    
datetime.datetime(2017, 8, 1, 10, 23, 51, tzinfo=datetime.timezone.utc)

date.tzname()
'UTC'

bearbeiten

Dies funktioniert nur unter python3 . Die z-Direktive ist in Python 2 nicht verfügbar. Code von _strptime.py

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X