Frage

Ich brauche zu speichern Artikel mit einem Kalendertag (nur am Tag, keine Zeit) in einer SQLite-Datenbank. Was ist der beste Weg, um das Datum in der Spalte zu repräsentieren? Julian Tage und Unix-Sekunden kommen als vernünftige Alternativen zu kümmern. Wenn ich mit einer anderen Einheit als Tage zu welcher Uhr Zeit gehen sollte es sein?

Update: Ich bin mir bewusst, ISO8601 und es tatsächlich das Datum als String in YYYY-MM-DD-Format für den Prototyp speichern verwendet. Aber für verschiedene arithmetische habe ich es intern zu einem gewissen Zahl zu konvertieren, also würde ich es vorziehen, eine Nummer zu speichern und nur für die Anzeige in String zu konvertieren. Welche Einheiten sollte diese Zahl in sein, mit welcher Herkunft, und wenn die Geräte genauer als Tage zu welcher Tageszeit verwendet werden soll?

War es hilfreich?

Lösung

Wenn Sie erwarten, um das Datum zu einem externen Tool oder Bibliothek zu verteilen, sollten Sie, was Format verwenden Sie es erwartet. Unix Zeit scheint die lingua franca des digitalen horography zu sein, so ist es ein guter Standard, wenn äußerten Umstände für Sie nicht die Wahl.

ISO 8601 von Interesse sein können.

Edit:

  

Aber für verschiedene arithmetisch Ich habe es intern zu einem gewissen Zahl konvertieren, so dass ich eine Nummer speichern würde es vorziehen, und nur für die Anzeige in String konvertieren.

Ach, das macht Sinn. Wenn Ihre Umgebung (.NET? Python? C ++?) Hat zeit Umgang mit Werkzeugen, es wäre am besten, ihre Muttereinheit und Epoche zu verwenden. Es gibt keinen Grund neu schreiben alle jene datumsManipulationsFunktionen; sie sind schwieriger, als sie aussehen. Ansonsten würde ich Tage in den lokalen (Gregorian?) Verwende Kalender seit einer angemessenen Zeit für Ihre Anwendung. Seien Sie großzügig, Sie wollen nicht zu einem Reverse-Y2K-Bug, wenn Sie plötzlich ein Datum behandeln müssen früher, als Sie jemals erwartet.

Die Tageszeit ist ausschließlich eine Frage des Geschmacks. Mitternacht scheint, wie die sauberste Wahl (alle Nullen in der Stunde, Minute, Sekunde Feldern), aber da es den Benutzer nie erreicht, es gibt keine praktischen Auswirkungen. Es wäre ein guter Ort für einen Osterei, in der Tat.

Andere Tipps

Wenn Sie möchten, dass Ihre Grundlagen abzudecken stellen Sie sicher, Sie speichern das Datum in utc und wählen Sie ein ISO-Standard. Dieser Ansatz erfordert wenig Aufwand und wird Ihren Code aus zukünftigen Interop Kopfschmerzen schützen. Ich stimme mit @skymt ISO 8601 ist eine gute Wahl.

Wenn Sie C ++ verwenden, dann boost :: date_time ist auch einen Blick wert.

„Best“ fast hängt ganz davon ab, wo die Daten herkommen (NSDate Objekte, einig XML-Feed) und wie sie manipuliert werden (einfach gespeichert, wie sie ist etwas Arithmetik vs. tun wie „Tage, bis“).

Ich empfehle nicht unbedingt, aber ich schrieb eine App, die auch zum Speichern benötigte Datum-but-not-Zeit in einer SQLite-DB. Zuerst habe ich zwei Spalten, Monat und Tag, in dem Monat, wie die Anzahl der Monate seit Januar 2000 festgelegt wurde, brauchte ich nur eine Zeile pro Tag zu erzwingen, so definiert ich einen eindeutigen Index für diese beiden Spalten, und es stellte sich out-Updates schrecklich langsam zu machen.

Für meinen zweiten Versuch habe ich ein ähnliches Schema, aber codierte das Datum in eine Reihe, durch die unteren 5 Bits für den Tag verwenden und die restlichen oberen Bits für den Monat (wieder, seit Januar 2000). Die Konvertierungsfunktionen waren:

Date = (Month << 5) | Day
Month = Date >> 5
Day = 0x1F & Date

Dieses Schema bewahrt numerischer Reihenfolge zu Terminen und macht es leicht, sie in Komponenten aufzuteilen. Es machte Sinn für meine Anwendung, weil ich Daten in monatlichen Brocken zu speichern. Wenn ein Datum angegeben, können Sie das nächste Datum finden wollen, diese Regelung vielleicht nicht die beste sein, da das Datum + 1 kein gültiges Datum sein kann.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top