2016-07-15 11 views
0

Ich entwickle eine Django App zum Loggen von Tauchgängen und jeder Tauchgang hat eine Datums- und eine Zeitzone. Ich verwende die Django-Zeitzonen-App für die Zeitzone.Zeige eine Zeit mit einer bestimmten Zeitzone in Django

class Dive(models.Model): 
    ... 
    date_time_in = models.DateTimeField(default=timezone.now) 
    timezone = TimeZoneField(default=timezone.get_current_timezone_name()) 

So ist der Benutzer in der Lage, eine Datetime-Zeichenfolge („2016.07.11 14.00 Uhr“) und wählen Sie eine Zeitzone („Asien/Bangkok“ - UTC + 0700) einzugeben, habe ich dann die Zeitzone der Datetime zu dem in meiner Sicht wie folgt gegeben:

def log_dive(request): 
    if request.method == 'POST': 
    form = DiveForm(request.POST) 
    if form.is_valid(): 
     dive = form.save(commit=False) 
     date = dive.date_time_in 
     date = date.replace(tzinfo=None) 
     dive.date_time_in = dive.timezone.localize(date) 
     dive.save() 

die Datenbank dann die Datetime als UTC in der Datenbank speichert (SELECT-Anweisung gibt es in meiner lokalen Zeitzone):

# SELECT date_time_in, timezone FROM divelog_dive ORDER BY number DESC; 
     date_time_in  |  timezone  
------------------------+------------------ 
2014-07-11 17:00:00+10 | Asia/Bangkok 

Jetzt Es gibt zwei Dinge, mit denen ich zu kämpfen habe i:

1) Ich möchte die Daten in der gegebenen Zeitzone anzeigen, aber ich kann nicht scheinen, sie zu stoppen, die zu der Einstellung TIME_ZONE vorgeht.

2) Wenn der Benutzer den Datensatz bearbeitet, sollte die Zeit, die im Eingabefeld angezeigt wird, die ursprünglich eingegebene sein (14:00), stattdessen wird sie in der aktuellen Zeitzone (17:00) angezeigt.

Antwort

0

Ihre Zeitzone Einstellung prüfen in settings.py

0

Haben Sie USE_TZ = in Ihren Einstellungen wahr Datei? Wenn Sie Ihre App mit dem Befehl djangoadmin-startproject erstellt haben, ist sie standardmäßig aktiviert.

Außerdem hatte ich bei meinem letzten Job Probleme mit Zeitzonen, aber ich fand, dass die Verwendung von Pytz wirklich hilfreich war. Hast du dieses Paket schon probiert?

EDIT: Ok Mann, den ich weg sein Weg, aber da niemand hat sonst beantwortet und ich fühle die Zeitzone Kampf, hier ist etwas, was ich bemerkt ...

Sie das Datum Objekt mit tz_info = Keine ersetzen, Aber möchten Sie das nicht durch die Zeitzone aus der Datenbank ersetzen? Also würdest du diese Zeitzone bekommen und einen Ersatz mit dem gültigen Format (tzinfo = blah ...) machen? Wie ich schon sagte, ich bin vielleicht weit weg, aber wenn das hilft, dann gehst du.

+0

Danke für Ihre Hilfe Chris, ich habe es jetzt herausgefunden, der Code I ist zum Speichern des Datetime korrekt geschrieben, die Zeile nach 'ersetzen (Tzinfo = None)' setzt die Zeitzone auf die vom Benutzer gewählte Zeitzone (dive.timezone ist das pytz timezone-Objekt). – xeonman9000

0

Tut mir leid, ich glaube nicht, dass ich mein Problem sehr gut erklärt habe. Ich habe es herausgefunden, also beantworte ich meine eigene Frage.

1) erwies sich als einfach zu sein, Django für die Anzeige von Zeiten in einer bestimmten Zone eine Template-Tag haben:

{{ dive.date_time_in|timezone:dive.timezone|date:"Y-m-d H:i e" }} 

für 2), stieß ich auf [1], die mich zu dieser Lösung führen: In Nachdem ich das Objekt aus der Datenbank bekommen habe, verwende ich astimezone (...), um den Datumswert (den der DB als UTC speichert) in die gegebene Zeitzone zu konvertieren. Ich benutze dann replace (tzinfo = None), um es naiv zu machen und dann wird es korrekt auf meinem Formular angezeigt.

def edit_dive(request, dive_id=None): 
    dive = None 
    if dive_id != None: 
    dive = get_object_or_404(Dive, pk=dive_id) 
    local_date = dive.date_time_in.astimezone(timezone(str(dive.timezone))) 
    dive.date_time_in = local_date.replace(tzinfo=None) 

[1] http://www.saltycrane.com/blog/2009/05/converting-time-zones-datetime-objects-python/

Verwandte Themen