2016-04-28 4 views
1

In meiner SQLite-Datenbank gibt es keinen Date Datentyp, also muss ich Zeitstempel im Textformat speichern.Was ist die geeignete Datumsformatierung, so dass die lexikographische Sortierung die gleiche ist wie die zeitliche Sortierung?

Ergibt das Format yyyy-MM-dd HH:mm die richtige Reihenfolge, so dass, wenn Sie es lexikographisch sortieren (indem Sie eine normale Sortierung ASC oder DESC tun), es auch nach dem Zeitwert inhärent sortiert?

+0

Tags zum Posten hinzugefügt – user6261756

+2

Sie könnten sie als INTEGER-Typ als Millisekunden speichern. –

+0

@ cricket_007 Ich dachte darüber nach, konnte aber nicht herausfinden, wie man leicht zwischen lesbaren Daten und SQL-freundlichen Millisekunden-Zahlen hin- und herwechseln kann. Ich wusste auch nicht, ob man viel mehr Platz einnahm als der andere, oder ob einer effizienter war als der andere. – user6261756

Antwort

1

Ja. Nur dass du keine 0s dazwischen verpassen solltest. ('04' für April).

Es ist notwendig, April als '04' darzustellen, nicht nur '4'.

+0

Entschuldigung, ich verstehe nicht, was du früher "ja" meintest. Was meinst du mit fehlenden 0's? – user6261756

+0

Dateformat 'MM' wird die Zero-Padding –

-1

Ihr Format ist die richtige Idee; wenn es alphabetisch sortiert ist, ist es auch chronologisch.

Sie können einen Schritt weiter gehen, für eine bessere Version dieses Formats, ein Standardformat, um Ihre Arbeit einfacher und einfacher zu machen.

ISO 8601

Der ISO 8601 Standard definiert eine Vielzahl von praktischen sinnvolle Formate für Textdatumszeitbezogene Werte darstellen.

Für ein Datum und Uhrzeit das Format kombiniert ist:

YYYY-MM-DDTHH: MM: SS.SZ

Zum Beispiel:

2016-04- 28T18: 22: 20.123Z

Dieses Format als eine Zeichenfolge sortiert chronologisch als yo du brauchst.

Die T in der Mitte trennt den Date-Teil vom Time-Teil. Die Z am Ende ist die Abkürzung für Zulu, was UTC bedeutet.

Im Allgemeinen empfiehlt es sich, die Datums- und Uhrzeitwerte in UTC für Speicher und Datenbank zu konvertieren. Ihr JDBC-Treiber macht das wahrscheinlich für Sie, aber ich weiß nichts über SQLite.

java.time

Der java.time Rahmen in Java 8 und später gebaut wird. Ein großer Teil dieser Funktionalität wird auf das Projekt & 7 im Projekt ThreeTen-Backport zurück portiert und im Projekt ThreeTenABP an Android angepasst.

Diese neuen Klassen ersetzen die alten java.util.Date/.Calendar und verwandte Klassen, die sich als schlecht entworfen und problematisch erwiesen haben.

Diese Klassen verwenden standardmäßig ISO 8601-Formate beim Analysieren/Generieren von Textdarstellungen von Datum-Uhrzeit-Werten. Durchsuchen Sie Stack Overflow nach vielen Beispielen. Ein Instant ist ein Moment auf der Timeline in UTC mit einer Auflösung von nanoseconds.

Instant instant = Instant.now(); 

Einfach toString rufen eine Stringdarstellung dieses Wertes zu erzeugen.

String stringForDatabase = instant.toString(); 

In Java 8 die aktuelle Zeit ist die Umsetzung der für den Bruchteil einer Sekunde Clock Schnittstelle, für 3 Dezimalstellen aufgrund legacy nur Millisekunden Auflösung erfasst. Zum Beispiel 2016-04-29T00:12:57.123Z. In Java 9 und höher hat eine moderne Implementierung von Clock, in der Lage, den aktuellen Moment in bis zu 9 Dezimalstellen (Nanosekunden) zu erfassen, soweit dies von der Hardware-Uhr Ihres Computers unterstützt wird.

Der Standardformatierer, der von Instant:toString verwendet wird, druckt den Bruchteil einer Sekunde mit 0, 3, 6 oder 9 Ziffern, so viele wie erforderlich, um den Nicht-Null-Anteil des Bruchteils einer Sekunde darzustellen. Alle diese sortieren alphabetisch & chronologisch wie angefordert, also konnten Sie irgendwelche von diesen in Ihrer Datenbank speichern.

  • 2016-04-29T00:12:57Z
  • 2016-04-29T00:12:57.123Z
  • 2016-04-29T00:12:57.123456Z
  • 2016-04-29T00:12:57.123456789Z

alle direkt Diese analysieren zurück in eine Instant Instanz. Sie müssen sich also nicht darum kümmern, ein eigenes Formatierungsmuster wie in der Frage zu definieren.

Instant instant = Instant.parse("2016-04-29T00:12:57.123456789Z"); 

Um die Wandtaktzeit für einen bestimmten Ort zu sehen, die eine Zeitzone (ZoneId) gilt ein ZonedDateTime zu erhalten.

Entpacken Sie einen Instant für die Speicherung zurück in die Datenbank.

+0

Down-Voter, bitte hinterlassen Sie eine Kritik zusammen mit Ihrem Down-Vote. –