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.
Tags zum Posten hinzugefügt – user6261756
Sie könnten sie als INTEGER-Typ als Millisekunden speichern. –
@ 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