2016-08-09 85 views
0

I Zeitzone in Django 1.8 konfiguriert haben (meine aktuelle Zeitzone UTC + 1 oder BST):Zeitzone in Django, DRF und PostgreSQL richtigen Einstellungen

TIME_ZONE = 'Europe/London' 
USE_I18N = True 
USE_L10N = True 
USE_TZ = True 

Ich habe Zeitstempel-Attribut in meinem Modell:

class NodeGPS(models.Model): 
    node_id = models.ForeignKey(Node) 
    timestamp = models.DateTimeField(auto_now_add=True, auto_now=False) 
    gps_latitude = models.FloatField(null=True, blank=True) 
    gps_longitude = models.FloatField(null=True, blank=True) 

Ich habe Django Rest Framework 3.4.0, also, wenn ich Daten über DRF Web-Schnittstelle Zeitstempel auf UTC automatisch, was ist 1 Stunde zurück von meiner aktuellen Zeit (UTC + 1). Im PostgreSQL-Zeitstempelfeld wird jedoch als UTC + 1 festgelegt. Auf der DRF-Weboberfläche wird jedoch immer die Zeit in UTC angezeigt.

Was für ein komisches Verhalten. Was ist ein Grund dafür?

Vielen Dank im Voraus für Anregungen!

Antwort

1

Während Zeiten in der lokalen Zeitzone in Vorlagen und Formularen konvertiert werden, werden sie nicht für Serializer konvertiert (und sind daher normalerweise UTC außer bei der Objekterstellung, wenn sie unabhängig vom Client hochgeladen werden). Die Annahme ist, dass jeder, der die API verwendet, sie über einen Client mit einer eigenen Art der Verarbeitung von Zeitzonen verwendet.

Die Lösung besteht darin, ein benutzerdefiniertes Datetime-Feld zu erstellen, das in die richtige Zeitzone konvertiert. Siehe hier: DjangoRestFramework ModelSerializer DateTimeField only converting to current timezone at object creation

Auch: Vorsicht vor dem PostgreSQL Timestamp Feld. Es gibt lediglich die Zeiten an, die in die Zeitzone konvertiert wurden, in der der Server denkt, wie in der Dokumentation:

Alle Zeitzone-bewussten Daten und Zeiten werden intern in UTC gespeichert. Sie werden in der vom Konfigurationsparameter timezone angegebenen Zone in die lokale Zeit konvertiert, bevor sie dem Client angezeigt werden.