2014-08-31 5 views
10

Ich möchte nur eine Bestätigung von den Experten. Ich bin immer noch nicht sicher in dem, was ich glaube, um die richtige Art der Lagerung und Behandlung von Daten in einer solchen Umgebung zu sein.Speichern von Datum und Zeitzonen in MongoDB

Ich entwickle eine kleine App, nur für italienische Benutzer.

Grundsätzlich sie eine Liste von Einträgen erstellen kann, die jeweils ein creation (Ich bin nur daran interessiert, den Datumsteil, ist die Zeit in meinem Szenario nicht sinnvoll).

So gibt der Benutzer in dem „Datum“ Formularfeld ein Datum in diesem Format: stellt 22/06/2014 den 22. Tag des Monats Juni des Jahres 2014. Dann Datum wie das analysiert wird:

entryData.dateEntry = moment($(form).find('input[name=dateEntry]').val(), 'DD-MM-YYYY').toDate(); 

Schließlich wird mein Einstiegsmodell zu einer backbone.js Sammlung hinzugefügt und serverseitig von Node.js + Express in MongoDB gespeichert.

Abfragen Mongo für Einträge, ich sehe:

2014-06-21 22:00:00 +0000

, die auf "dateEntry" entspricht: Datum (1403388000000).

Googeln herum, entdeckte ich, dass MongoDB nicht das Konzept der Zeitzone hat. Alle Daten werden in UTC gespeichert und das Datumsobjekt, das ich zuvor erstellt habe, hatte GMT + 2. Aber ich habe wirklich Angst ... Wie bekomme ich das Datum meiner lokalen Zeitzone auf die leichte Art zurück?

Als nächstes werde ich Eingabedaten in einer Unter Vorlage angezeigt werden, auf diese Weise:

<%= moment(dateEntry).format('DD/MM/YYYY') %> 

Und ... voilà! Ich bekomme mein lokales "italienisches" Datum zurück: 22/06/2014.

Nun, meine Frage: ist das der richtige Weg zu gehen?

Der Prozess ist: parse Daten in lokaler Zeitzone => in Utc speichern => Daten in lokaler Zeitzone abrufen. Ist es eine übliche Praxis?

Ich dachte auch: kann ich nicht einfach vermeiden Zeitzonen zu verwenden und meine lokale (italienische) Zeit zu speichern, wie es war (2014-06-22 00:00:00)? Ist das so schlimm?

+1

ich alles eingerichtet UTC vorne sein zu sichern (Datenbank, Server, Client-Kommunikation, ...) mit an den äußersten Rand der Anwendung behandelten Zeitzonen mit. Ich arbeite normalerweise in Rails, also weiß ich nicht, wie die Dinge normalerweise in der node.js-Welt erledigt werden. –

Antwort

4

Ja, es ist eine gängige Praxis, alle Zeitstempel in UTC zu speichern und sie dann in bestimmte Zeitzonen in den äußeren Schichten zu konvertieren. Viele Frameworks machen das automatisch für Sie, einschließlich Rails. Lassen Sie uns sagen, wenn Sie vorwärts gehen, beginnen Sie auch, andere Zeitzonen zu versorgen, Sie werden keine Probleme haben, weil Ihre Datenbank UTC-Einträge hat. Sie sparen den Overhead von Zeitzonen-Conversions.

Wenn Sie nur Daten speichern möchten, können Sie das auch tun, aber ich sehe keinen Schaden in der Art, wie Sie es gerade tun - speichern Sie alles in UTC. Ich bin mir nicht sicher über node.js, aber es gibt einige Einstellungen, wo Sie die Zeitzone (von Italien) angeben können, und alle Ihre Konvertierungen werden automatisch passieren.Sie können diesen Thread nützlich finden:

How can I set the default timezone in node.js?

+0

Das Problem dabei ist, dass einige Länder je nach Jahreszeit unterschiedliche utc-Offsets verwenden. Dies ist notwendig, um den UTC-Offset zu speichern, um die tatsächliche Zeit zu erfahren, zu der ein bestimmter Eintrag gemacht wurde. Dazu wäre es hilfreich, wenn Mongo nicht nur 'Z', sondern auch lokale Zeitstempel speichern könnte. – tomascharad

+0

Ich glaube nicht. UTC ist ein Standard. Führen Sie die Konvertierung vor dem Speichern durch und speichern Sie sie als UTC. Dann wandeln Sie es in der gewünschten Zeitzone zurück, bevor Sie es anzeigen. Wenn Sie die lokale Zeit unbedingt speichern möchten, speichern Sie sie als String in mongo db und konvertieren Sie sie in die Zeit auf der Anwendungsebene. –

+0

Ich mache es so, wie du es erwähnst. Ich denke nur, dass das Speichern des Datums in der Ortszeit und das Hinzufügen des UTC-Offsets (folgend auf iso8601) in einem einzelnen Datumsfeld, anstatt diese in zwei separaten Feldern zu speichern, besser möglich ist. – tomascharad