Django: Zeit-zone Ausgabe
HINWEIS: ich löschte die Frage, wie es existierte zuvor und Ihnen nur die relevanten Infos hier.
Unserer Datenbank server (RH) hat TIME_ZONE = "Europe/London" angegeben. Und, in der Django settings.py wir geben TIME_ZONE = "America/New_York".
Und in meiner Model-Klasse habe ich angegeben:
created = models.DateTimeField(editable=False,auto_now=False, auto_now_add=True)
modified = models.DateTimeField(editable=False,auto_now=True, auto_now_add=True)
Wenn ich dann geh mal auf die Daten in der admin-Website, die ich bekommen UTC/GMT-Zeit statt Eastern.
Dachte ich, dass alle Zeit angepasst automatisch von Django, da habe ich angegeben "Amerika/New_York" Django-die Zeit-Zone.
Jede Hilfe/Aufklärung sehr geschätzt wird.
Dank
Eric
InformationsquelleAutor der Frage | 2011-01-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sich auf Datum/Zeit 'automagic' ist gefährlich und diese auto_add Parameter des Modells sind eine Falle. Immer verstehen die Zeitzone(N), die Sie zu tun haben. Python macht dies einfacher durch das anbringen einer tzinfo Mitglied seiner datetime-Objekte. Während diese Objekte sind 'naive' standardmäßig, ich ermutige Sie, bringen Sie immer tzinfo detail. Noch Python braucht einige zusätzliche Hilfe mit entweder python-dateutil oder pytz (was ich benutze). Hier ist eine Allgemeine Regel, obwohl Sie immer speichern Sie Ihre datetimes in einer Datenbank als UTC.
Warum? Ihre Benutzer können in verschiedenen einheimischen, Handys und laptops, Reisen, Server falsch konfiguriert oder spiegelt sich in verschiedenen Zeitzonen. So viele Kopfschmerzen. Datetimes sollte nie naiv sein, und ob Sie (in einer Datenbank) und Sie benötigen den Kontext, auch eine Zeitzone-Feld in der Tabelle.
So, in Ihrem Fall.
Wenn Sie pytz, die lokalisieren() Methode ist groß. Python datetime-Objekt hat den nützlichen replace() und astimezone().
Noch ein Hinweis, wenn Ihre Datenbank ist die Zeitzone naiv (wie MySQL) stellen Sie sicher, dass Ihre datetimes sind in UTC angegeben und verwenden Sie dann ersetzen(tzinfo=None), weil der Datenbank-connector nicht umgehen kann, tz-fähige Objekte.
Hier ist ein thread mit detail auf Django ' s auto_now Felder.
InformationsquelleAutor der Antwort JCotton
First off, ich würde wollen, dass meine Daten gespeichert werden als UTC-weil es ein guter Ausgangspunkt.
So lassen Sie mich Fragen, Warum tun Sie müssen die Zeit, in EST ist, ist diese für den end-Benutzer, oder Sie müssen auf Logik auf dem server und müssen es in EST?
Wenn es für den Endanwender leicht zu beheben ist, um die Benutzer-browser behandeln die Konversion zu der richtigen Zeit. Auf dem server konvertieren das datetime-Objekt in eine timestamp:
Und dann auf der web-Seite instanziieren eines Datum-Objekts:
Nun, auf der anderen Seite, wenn Sie wollen, um die Zeit in der korrekten zone auf dem server, so dass Sie durchführen können Logik auf. Ich empfehle, mit Hilfe der python-dateutil. Es wird Ihnen erlauben, leicht zu wechseln, eine andere Zeitzone:
Nun, wenn Sie wirklich wollen, speichern Sie die datetime-EST, die Sie benötigen, ändern Sie die Zeit auf dem DB-server (wie Ajay Yadav und gorus gesagt). Ich weiß nicht, warum Sie wollen, speichern Sie Sie als EST, aber dann wieder ich weiß nicht, was Ihre Anwendung ist.
InformationsquelleAutor der Antwort MattoTodd
Wenn Sie sagen, auto_now_add=True, wird der Wert Hinzugefügt werden, indem Sie Ihre Datenbank-server und nicht deine django-server. So müssen Sie die Zeitzone auf Ihrem Datenbank-server.
InformationsquelleAutor der Antwort Ajay Yadav
Da Sie bearbeitet die Frage, werde ich Bearbeiten, meine Antwort 🙂 Django können nicht kontrollieren, die Zeit-zone der db, also der Weg, um dies zu beheben, aktualisieren Sie die Zeitzone für Ihre db. Für MySql diese Abfrage ausführen:
SELECT @@global.time_zone, @@session.time_zone;
Diese sollten wieder zurück
SYSTEM, SYSTEM
standardmäßig, die in Ihrem Fall bedeutet "Europa/London", und die Ursache des Problems. Nun, Sie haben überprüft, befolgen Sie die Anweisungen im ersten Kommentar auf dieser Seite:http://dev.mysql.com/doc/refman/5.5/en/time-zone-support.html
Erinnern, neu zu starten, MySql-server, nachdem Sie aktualisiert haben, die Zeitzone, damit die änderungen wirksam werden.
InformationsquelleAutor der Antwort gorus