2009-03-10 9 views
4

(Ich bin neu in Python und Google App Engine, bitte vergib mir, wenn meine Fragen einfach scheinen).Python tzinfo und Tageslicht

Ich habe eine höllische Zeit versucht, mehrere Benutzer Zeitzonen in meiner Google App Engine-Anwendung zu verwalten.

Hier sind meine Einschränkungen:

  1. Wenn ein Benutzer die Zeit an einem Eingang betritt, wird es Ortszeit (einschließlich DST, wenn angebracht) sein.
  2. Wenn ein Benutzer die Uhrzeit nicht eingibt, muss das System sie in ihrer Ortszeit eingeben (einschließlich der Sommerzeit, falls zutreffend).
  3. Wenn das Datum und die Uhrzeit für den Benutzer angezeigt werden, müssen sie in ihrer Ortszeit (einschließlich DST, wenn angebracht) sein

ich, dass die Zeit verstehen intern als UTC mit einem Tzinfo Objekt gespeichert werden und dass Die App Engine speichert die Modelle mit UTC-Zeit.

Ich dachte vorher, ich hätte das alles ausgearbeitet, indem ich den Benutzer gebeten habe, seine Zeitzone in seinen Einstellungen anzugeben. Dann würde ich einfach ihre Voreinstellungen laden und diese TZInfo zu jedem Datetime-Objekt in Bezug auf diesen Benutzer hinzufügen.

Unsere kürzliche Sommerzeit hat es jedoch gebrochen. Es stellt sich heraus, dass ich das dst() in meinen tzinfo-Objekten nicht korrekt implementiert habe. Wie ich es verstehe, muss ich feststellen, ob DST gerade eingeschaltet ist, und wenn ja, dann gebe den korrekten Offset für die TZInfo zurück.

Das Problem ist, ich habe keine Ahnung, wie zu bestimmen, ob die Zeitzone der Zeitzone aktuell ist oder nicht. Fehle ich etwas Offensichtliches?

Antwort

11

Wenn Sie können, würde ich empfehlen, einen Blick auf die python-dateutil-Paket, das tz-Objekte für alle Zeitzonen, einschließlich DST Offset-Informationen vorgefertigt hat. Ich glaube nicht, dass es einen Weg gibt, "nur zu wissen", ob DST aktiviert ist oder nicht, ohne Daten zu unterstützen ... es ist für die meisten Zeitzonen (oder zumindest für Zeitzonen, die DST unterstützen) bestimmt Sitte, Politik und alle möglichen Dinge.

http://labix.org/python-dateutil

+0

Momentan verwende ich Dateutil zum Parsen usw.Es gibt zwei Probleme damit, 1) es benötigt eine Datei, die ich brauche, um die Tzinfos zu erstellen und 2) die Bestimmung der Sommerzeit basiert auf der Zeit von Google App Engine, nicht auf der Zeit des Benutzers (unter Verwendung eines Browsers) . – mawcs

+0

Ich dachte, dass die Datei mit dem Paket geliefert wurde ... es schien dort zu sein, als ich gerade die Distribution heruntergeladen habe. –

+0

In der Tat, um aktuelle Zeit zu berechnen, oder um eine Zeit zu konvertieren, benötigt es die Zeit, DST und Zeitzone des Servers/Herkunft TZ, um den Offset gegen das Ziel TZ zu bestimmen ... aber es ist möglich, eine bestimmte Zeit instanziieren (dh: 16.00 Uhr, im Gegensatz zu "jetzt") in einem TZ ohne Bezug auf die Uhr des Servers. –

2

Ich sehe einige Probleme hier.

Wenn der Benutzer die Uhrzeit eingibt, wird sie in der lokalen Zeitzone eingegeben, aber woher wissen Sie, welche? Europa/Vilnius oder Europa/Madrid? Oder vielleicht Australien/Melbourne? Wenn Sie die Zeitzone nicht kennen, wird das Datum/die Uhrzeit "naiv".

Die einzige Datenbank, die Zeitzone geeignete und präzise betrachtet wird (der Zustand von konstantem Fluß Berücksichtigung) ist Olson Zeitzone db, für Python als pytz Paket. Es ermöglicht das einfache Konvertieren von Datum/Zeit zwischen Zeitzonen: Zuerst nehmen Sie Datum/Zeit und Zeitzone vom Benutzer, lokalisieren Datum/Zeit in der Zeitzone des Benutzers und nehmen es dann als utc, bereit in Ihrer Datenbank zu speichern. Die Anzeige erfolgt in umgekehrter Reihenfolge: Datum/Uhrzeit aus der Datenbank abrufen, in der Datei utc lokalisieren und dann als Benutzerzeitzone anzeigen.

Und das letzte Ding: es gibt keine automatische DST Umwandlung. Bei mehrdeutigen Daten müssen Sie im Voraus wissen, in welcher Zeitzone die Uhrzeit eingegeben wird. Das ist unsere menschliche Realität.

+0

Ich frage mich, ob Sie den Teil vermisst haben, wo ich gesagt habe, "... indem ich den Benutzer frage, seine Zeitzone in seinen Einstellungen anzugeben ..." Also kenne ich den Benutzer Eingabe der Zeitzone im Voraus. Ich habe keinen Speicherplatz für Pytz und das Python-Dateutil-Paket ist viel leichter als Pytz und bietet alles, was ich brauche. – mawcs

+0

Nun, ja, eigentlich ... Wie für die Paketgröße, ist die komplette Pytz 8 Dateien, ~ 500kB. Nicht sehr viel. – zgoda