datetime.datetime.utcnow()
Warum gibt es datetime
hier keine Zeitzoneninformationen, da es sich explizit um eine UTC handelt datetime
?
Ich würde erwarten, dass dies enthalten würde tzinfo
.
datetime.datetime.utcnow()
Warum gibt es datetime
hier keine Zeitzoneninformationen, da es sich explizit um eine UTC handelt datetime
?
Ich würde erwarten, dass dies enthalten würde tzinfo
.
Antworten:
Das heißt, es ist zeitzonennaiv, sodass Sie es nicht mit verwenden können datetime.astimezone
Sie können ihm eine Zeitzone wie diese geben
import pytz # 3rd party: $ pip install pytz
u = datetime.utcnow()
u = u.replace(tzinfo=pytz.utc) #NOTE: it works only with a fixed utc offset
Jetzt können Sie die Zeitzonen ändern
print(u.astimezone(pytz.timezone("America/New_York")))
Um die aktuelle Zeit in einer bestimmten Zeitzone abzurufen, können Sie tzinfo datetime.now()
direkt an Folgendes übergeben :
#!/usr/bin/env python
from datetime import datetime
import pytz # $ pip install pytz
print(datetime.now(pytz.timezone("America/New_York")))
Es funktioniert für jede Zeitzone, einschließlich derer, die die Sommerzeit (DST) einhalten, dh es funktioniert für Zeitzonen, die zu unterschiedlichen Zeiten unterschiedliche UTC-Offsets aufweisen können (nicht fester UTC-Offset). Nicht verwenden tz.localize(datetime.now())
- es kann während des Übergangs am Ende der Sommerzeit fehlschlagen, wenn die Ortszeit nicht eindeutig ist.
astimezone
. Datetime hat also nicht nur keine nativen Zeitzonen, sondern die einzige weit verbreitete Implementierung von tzinfo entspricht nicht dem vermeintlichen Standard.
u=datetime.now(pytz.utc)
tz.localize(datetime.now())
; Verwenden Sie datetime.now(tz)
stattdessen.
Beachten Sie, dass das datetime
Modul ab Python 3.2 enthält datetime.timezone
. Die Dokumentation für datetime.utcnow()
sagt:
Eine bekannte aktuelle UTC-Uhrzeit kann durch Aufrufen abgerufen werden .
datetime.now
(
timezone.utc
)
So können Sie tun:
>>> import datetime
>>> datetime.datetime.now(datetime.timezone.utc)
datetime.datetime(2014, 7, 10, 2, 43, 55, 230107, tzinfo=datetime.timezone.utc)
datetime.now(timezone.utc)
oder datetime.utcnow(timezone.utc)
?
datetime.utcnow()
nimmt keine Argumente. So müsste es sein datetime.now(timezone.utc)
.
datetime.now()
gibt die Maschinenzeit zurück, datetime.utcnow()
gibt aber die tatsächliche UTC-Zeit zurück.
datetime.utcnow()
nicht tzinfo
an, dass es sich um UTC handelt. Gibt datetime.now(datetime.timezone.utc)
aber die UTC-Zeit mit tzinfo
set zurück.
tz
Objekt im now-Konstruktor übergeben, wird die Zeit dieser Zeitzone zurückgegeben? OK! Vielen Dank für den Hinweis.
Die Standard-Python-Bibliotheken enthalten keine tzinfo-Klassen ( siehe jedoch S. 431 ). Ich kann nur die Gründe erraten. Persönlich denke ich, dass es ein Fehler war, keine tzinfo-Klasse für UTC aufzunehmen, da diese unumstritten genug ist, um eine Standardimplementierung zu haben.
Bearbeiten: Obwohl es keine Implementierung in der Bibliothek gibt, wird in der tzinfo
Dokumentation eine als Beispiel angegeben .
from datetime import timedelta, tzinfo
ZERO = timedelta(0)
# A UTC class.
class UTC(tzinfo):
"""UTC"""
def utcoffset(self, dt):
return ZERO
def tzname(self, dt):
return "UTC"
def dst(self, dt):
return ZERO
utc = UTC()
So verwenden Sie es, um die aktuelle Uhrzeit als bewusstes Datum / Uhrzeit-Objekt abzurufen:
from datetime import datetime
now = datetime.now(utc)
Es gibt datetime.timezone.utc
in Python 3.2+:
from datetime import datetime, timezone
now = datetime.now(timezone.utc)
datetime
Objekte verwendet wurde, die von erstellt wurden utcnow()
) ...
timezone.utc
wurde schließlich zu Python 3.2 hinzugefügt. Gibt aus Gründen der Abwärtskompatibilität utcnow()
immer noch ein zeitzonenloses Zeitobjekt zurück, aber Sie können das, was Sie möchten, durch Aufrufen erhalten now(timezone.utc)
.
struct
Modul hat automatische Konvertierungen von Unicode zu Bytestring durchgeführt, und die endgültige Entscheidung war, die Kompatibilität mit früheren Python 3-Versionen zu unterbrechen, um zu verhindern, dass eine schlechte Entscheidung getroffen wird.
tzinfo
Dokumentation Beispiele für Code zur Implementierung enthält, aber diese Funktionalität ist in datetime selbst nicht enthalten! docs.python.org/2/library/datetime.html#datetime.tzinfo.fromutc
pytz
ist eine großartige Ressource. Als ich meine Antwort bearbeitet hatte, um sie in den Beispielcode einzufügen, hatte es bereits jemand anderes vorgeschlagen, und ich wollte ihren Donner nicht stehlen.
Das pytz
Modul ist eine Option, und es gibt eine andere python-dateutil
, die zwar ebenfalls ein Paket eines Drittanbieters ist, jedoch abhängig von Ihren anderen Abhängigkeiten und Ihrem Betriebssystem möglicherweise bereits verfügbar ist.
Ich wollte diese Methode nur als Referenz aufnehmen. Wenn Sie sie bereits python-dateutil
für andere Zwecke installiert haben , können Sie sie verwenden, tzinfo
anstatt sie zu duplizierenpytz
import datetime
import dateutil.tz
# Get the UTC time with datetime.now:
utcdt = datetime.datetime.now(dateutil.tz.tzutc())
# Get the UTC time with datetime.utcnow:
utcdt = datetime.datetime.utcnow()
utcdt = utcdt.replace(tzinfo=dateutil.tz.tzutc())
# For fun- get the local time
localdt = datetime.datetime.now(dateutil.tz.tzlocal())
Ich stimme eher zu, dass Anrufe an utcnow
die UTC-Zeitzoneninformationen enthalten sollten. Ich vermute, dass dies nicht enthalten ist, da die native datetime-Bibliothek aus Gründen der Kreuzkompatibilität standardmäßig naive datetimes verwendet.
utcdt = datetime.datetime.utcfromtimestamp(1234567890).replace(dateutil.tz.tzutc())
datetime.now(pytz_tz)
funktioniert immer; datetime.now(dateutil.tz.tzlocal())
kann während der Sommerzeitübergänge fehlschlagen . PEP 495 - Lokale Zeitdisambiguierung könnte die dateutil
Situation in Zukunft verbessern .
utc_dt = datetime.fromtimestamp(1234567890, dateutil.tz.tzutc())
(Hinweis: dateutil
Wenn ein nicht fester utc-Offset (z. B. dateutil.tz.tzlocal()
) hier fehlschlägt , verwenden Sie stattdessen eine pytz
Lösung auf Basis ).
dateutil
für dateutil.parser
mochte ich diese Lösung am besten. Es war so einfach wie : utcCurrentTime = datetime.datetime.now(tz=dateutil.tz.tzutc())
. Viola!!
Julien Danjou hat einen guten Artikel geschrieben, in dem erklärt wird, warum Sie sich niemals mit Zeitzonen befassen sollten . Ein Ausschnitt:
In der Tat gibt die Python-Datetime-API immer unbekannte Datetime-Objekte zurück, was sehr unglücklich ist. Sobald Sie eines dieser Objekte erhalten, können Sie die Zeitzone nicht mehr kennen. Daher sind diese Objekte für sich genommen ziemlich "nutzlos".
Leider utcnow()
werden die Zeitzoneninformationen, wie Sie festgestellt haben , auch dann nicht angezeigt, wenn Sie sie verwenden .
Empfehlungen:
Verwenden Sie immer bewusste
datetime
Objekte, dh mit Zeitzoneninformationen. Dadurch wird sichergestellt, dass Sie sie direkt vergleichen können (bewusste und unbewusstedatetime
Objekte sind nicht vergleichbar) und sie korrekt an Benutzer zurückgeben. Leverage pytz zu Zeitzone Objekte.Verwenden Sie ISO 8601 als Eingabe- und Ausgabezeichenfolgenformat. Verwenden Sie
datetime.datetime.isoformat()
diese Option, um Zeitstempel als Zeichenfolge zurückzugeben, die mit diesem Format formatiert ist, das die Zeitzoneninformationen enthält.Wenn Sie Zeichenfolgen mit ISO 8601-formatierten Zeitstempeln analysieren müssen, können Sie sich darauf verlassen
iso8601
, dass Zeitstempel mit korrekten Zeitzoneninformationen zurückgegeben werden. Dies macht Zeitstempel direkt vergleichbar.
So fügen Sie timezone
Informationen in Python 3.2+ hinzu
import datetime
>>> d = datetime.datetime.now(tz=datetime.timezone.utc)
>>> print(d.tzinfo)
'UTC+00:00'
AttributeError: 'module' object has no attribute 'timezone'
Python 2.7.13 (Standard, 19. Januar 2017, 14:48:08)
from datetime import datetime
from dateutil.relativedelta import relativedelta
d = datetime.now()
date = datetime.isoformat(d).split('.')[0]
d_month = datetime.today() + relativedelta(months=1)
next_month = datetime.isoformat(d_month).split('.')[0]
UTC-Daten benötigen keine Zeitzoneninformationen, da sie UTC sind, was per Definition bedeutet, dass sie keinen Versatz haben.
pytz.utc
. B. mit ). Beachten Sie, dass es einen großen Unterschied zwischen einem Wert gibt, dessen Versatz von UTC unbekannt ist, und einem Wert, bei dem bekannt ist, dass er 0 ist. Letzteres utcnow()
sollte IMO zurückgeben. Dies würde gemäß der Dokumentation zu "Ein bewusstes Objekt wird verwendet, um einen bestimmten Zeitpunkt darzustellen, der nicht interpretiert werden kann" passen.