Verwenden
published_time = pytz.utc.localize(datetime.utcfromtimestamp(calendar.timegm(parsed_entry.published_parsed)))
feedparser eine große Auswahl von Datumsformaten analysieren kann, können Sie sie here finden.
Wie Sie in feedparser/feedparser/datetimes/__init__.py
, die eingebaute Funktion von feedparser _parse_date
führt Folgendes sehen: Dieser
Parses a variety of date formats into a 9-tuple in GMT
bedeutet, dass in parsed_entry.published_parsed
Sie haben eine time.struct_time
Objekt in GMT Zeitzone.
Wenn Sie es zu einem datetime
Objekt konvertieren mit
published_time = datetime.fromtimestamp(mktime(parsed_entry.published_parsed))
das Problem ist, dass mktime
geht davon aus, dass die übergebene Tupel in Ortszeit ist, das nicht der Fall, es ist GMT/UTC! Ansonsten lokalisieren Sie das Objekt datetime
am Ende der Konvertierung nicht ordnungsgemäß.
Sie müssen diese Konvertierung durch die folgenden ersetzen, wobei Sie daran denken, dass Feedparser eine GMT struct_time
zurückgibt und diese mit der gewünschten Zeitzone lokalisiert (UTC der Einfachheit halber).
- Sie verwenden
calendar.timegm
, die die Anzahl der Sekunden zwischen Epoche und das Datum als Parameter übergeben gibt, unter der Annahme, dass das übergebene Objekt in UTC ist/GMT (wir wissen aus feedparser es ist)
- Sie
utcfromtimestamp
verwenden um ein naives datetime
Objekt zu erhalten (von dem wir wissen, dass es ein Datetime in UTC ist, aber Python nicht in diesem Moment)
- Mit
pytz.utc.localize
lokalisieren Sie in UTC das datetime
Objekt richtig.
Beispiel:
import calendar
from datetime import datetime
import pytz
localized_dt = pytz.utc.localize(datetime.utcfromtimestamp(calendar.timegm(parsed_entry.published_parsed)))
Solange Sie konsistent sind, spielt es keine Rolle, ob Sie fromtimestamp
oder utcfromtimestamp
verwenden. Wenn Sie fromtimestamp
verwenden, müssen Sie Python mitteilen, dass das von Ihnen erstellte Objekt datetime
über die lokale Zeitzone verfügt. Angenommen, Sie in Europa/Berlin sind, ist dies auch in Ordnung:
pytz.timezone('Europe/Berlin').localize(datetime.fromtimestamp(calendar.timegm(parsed_entry.published_parsed)))
Waren parsed_entry.published_parsed
auch in lokaler Zeitzone, mktime
anstelle von calendar.timegm
verwendet werden muss.
Als Alternative Sie sich die Datenkette analysieren können Sie von feedparser erhalten parsed_entry['published']
from dateutil import parser
localized_dt = parser.parse(parsed_entry['published'])
Sie können überprüfen, dass die folgenden Renditen True
:
parser.parse(parsed_entry['published']) == pytz.utc.localize(datetime.utcfromtimestamp(calendar.timegm(parsed_entry.published_parsed)))
Die Django TIME_ZONE
Einstellung tatsächlich nicht wichtig, weil es nur zu Visualisierungszwecken verwendet wird oder um naive Datumsangaben automatisch zu konvertieren.
When USE_TZ is True, this is the default time zone that Django will use to display datetimes in templates and to interpret datetimes entered in forms.
Es ist wichtig, immer genau lokalisierte Datumswerte zu verwenden, egal welche Zeitzone verwendet wird. Solange sie nicht naiv sind, werden sie von Django korrekt gehandhabt.
Sind Sie an einer Zeitzonenumwandlung interessiert oder möchten Sie einfach eine Stunde mit einer Datetime hinzufügen?Timedelta-Betrieb? – JwM
Letztendlich möchte ich die korrekte Zeit in UTC haben. Eine Stunde weg zu nehmen (zwei Stunden in der Tagessparperiode) kann ein Weg sein zu gehen. Ich habe es aber noch nicht angeschaut. Ich habe mich gefragt, ob es einen anderen Weg gab. Ich habe zum Beispiel timezone.activate() und timezone.deactivate() versucht, die die current_timezone auf die richtige Weise zu ändern schien, aber das hat das Problem nicht behoben. – apiljic
Sie können eine datetime zur Kenntnis nehmen oder die Zeitzone ändern, wenn sie bereits weiß, aber falsch ist. –