453 Stimmen

Warum enthält datetime.datetime.utcnow() keine Zeitzoneninformationen?

datetime.datetime.utcnow()

Warum ist das datetime keine Angaben zur Zeitzone, da es sich ausdrücklich um eine UTC datetime ?

Ich würde erwarten, dass dies Folgendes enthält tzinfo .

339voto

Craig McQueen Punkte 39286

Beachten Sie, dass ab Python 3.2 die datetime Modul enthält datetime.timezone . Die Dokumentation für datetime.utcnow() sagt:

Eine bekannte aktuelle UTC-Datumszeit kann durch den Aufruf von datetime.now(timezone.utc) .

Also, datetime.utcnow() setzt nicht tzinfo um anzuzeigen, dass es sich um UTC handelt, aber datetime.now(datetime.timezone.utc) gibt die UTC-Zeit zurück mit tzinfo gesetzt.

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

247voto

John La Rooy Punkte 278961

Das bedeutet, dass es nicht auf die Zeitzone abgestimmt ist, so dass Sie es nicht mit datetime.astimezone

können Sie ihm eine Zeitzone wie folgt zuweisen

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 zu erhalten, können Sie tzinfo an datetime.now() direkt:

#!/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 derjenigen, die die Sommerzeit einhalten, d.h. es funktioniert für Zeitzonen, die zu verschiedenen Zeiten unterschiedliche UTC-Offsets haben können (nicht-fixer UTC-Offset). Verwenden Sie nicht tz.localize(datetime.now()) -- es kann bei der Umstellung auf die Sommerzeit fehlschlagen, wenn die Ortszeit nicht eindeutig ist.

86voto

Mark Ransom Punkte 283960

Die Standard-Python-Bibliotheken enthielten bis Python 3.2 keine tzinfo-Klassen. Über die Gründe kann ich nur mutmaßen. Persönlich denke ich, dass es ein Fehler war, keine tzinfo-Klasse für UTC aufzunehmen, weil diese Klasse unumstritten genug ist, um eine Standardimplementierung zu haben. Obwohl es keine Implementierung in der Bibliothek gab, ist eine solche als Beispiel in der tzinfo Dokumentation .

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

Sobald Sie eine UTC haben tzinfo Objekts, können Sie es trotzdem nicht mit utcnow . Um die aktuelle Zeit als bewusstes datetime-Objekt zu erhalten:

from datetime import datetime 

now = datetime.now(utc)

In Python 3.2 haben sie endlich eine UTC tzinfo Klasse in der Bibliothek:

from datetime import datetime, timezone 

now = datetime.now(timezone.utc)

In Python 3.9 haben sie tzinfo Klassen für alle anderen Zeitzonen. Siehe PEP 615 -- Unterstützung für die IANA-Zeitzonendatenbank in der Standardbibliothek für alle Einzelheiten.

21voto

bbengfort Punkte 4862

En pytz Modul ist eine Möglichkeit, und es gibt eine weitere python-dateutil das zwar auch ein Paket eines Drittanbieters ist, aber je nach Ihren anderen Abhängigkeiten und Ihrem Betriebssystem bereits verfügbar sein kann.

Ich wollte diese Methodik nur als Referenz einfügen - wenn Sie bereits Folgendes installiert haben python-dateutil für andere Zwecke verwenden, können Sie seine tzinfo statt einer Vervielfältigung mit pytz

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 neige dazu, zuzustimmen, dass Aufrufe zu utcnow sollte die Information über die UTC-Zeitzone enthalten. Ich vermute, dass dies nicht enthalten ist, weil die systemeigene datetime-Bibliothek aus Kompatibilitätsgründen standardmäßig naive Datumsangaben verwendet.

16voto

nordborn Punkte 437

Zum Hinzufügen timezone Informationen in Python 3.2+

import datetime

>>> d = datetime.datetime.now(tz=datetime.timezone.utc)
>>> print(d.tzinfo)
'UTC+00:00'

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