Ich benutze JodaTime 1.6.2.
Ich habe eine LocalDate
, die ich entweder in eine (Joda) LocalDateTime
oder eine java.sqlTimestamp
für das Ormapping konvertieren muss.
Der Grund dafür ist, dass ich herausgefunden habe, wie man zwischen a LocalDateTime
und a konvertiert java.sql.Timestamp
:
LocalDateTime ldt = new LocalDateTime();
DateTimeFormatter dtf = DateTimeFormatter.forPattern("yyyy-MM-dd HH:mm:ss");
Timestamp ts = Timestamp.valueOf(ldt.toString(dtf));
Wenn ich also nur zwischen LocalDate
und konvertieren LocalDateTime
kann, kann ich die fortgesetzte Konvertierung in durchführen java.sql.Timestamp
. Vielen Dank für alle Anstöße in die richtige Richtung!
java.sql.Timestamp
Klasse jetzt ein Vermächtnis, das durch die Klassen java.time ersetzt wird , insbesondere durchInstant
.Antworten:
JodaTime
So konvertieren JodaTime ist
org.joda.time.LocalDate
zujava.sql.Timestamp
, gerade zu tunSo konvertieren JodaTime ist
org.joda.time.LocalDateTime
zujava.sql.Timestamp
, gerade zu tunJavaTime
So konvertieren Java8 ist
java.time.LocalDate
zujava.sql.Timestamp
, gerade zu tunSo konvertieren Java8 ist
java.time.LocalDateTime
zujava.sql.Timestamp
, gerade zu tunquelle
LocalDateTime
auf,DateTime
da nicht alleLocalDateTime
s gültig sindDateTime
. Quelle: joda-time.sourceforge.net/faq.html#illegalinstant und nur darauf stoßen .Timestamp#valueOf()
akzeptiert die Methode seit Java SE 1.8 auch aLocalDateTime
.Der beste Weg, um die Java 8-Zeit-API zu verwenden:
Zur Verwendung mit JPA in Ihr Modell einfügen ( https://weblogs.java.net/blog/montanajava/archive/2014/06/17/using-java-8-datetime-classes-jpa ):
Jetzt ist es also eine relative zeitzonenunabhängige Zeit. Zusätzlich ist es einfach zu tun:
Formatierung:
UPDATE: Postgres 9.4.1208, HSQLDB 2.4.0 usw. verstehen die Java 8 Time API ohne Konversationen!
quelle
tl; dr
Das Joda-Time- Projekt befindet sich im Wartungsmodus und wird jetzt durch java.time- Klassen ersetzt.
java.time.Instant
Klasse.LocalDateTime
java.sql.Timestamp
Erfassen Sie den aktuellen Moment in UTC.
So speichern Sie diesen Moment in der Datenbank:
So rufen Sie diesen Moment aus der Datenbank ab:
Zum Einstellen der Wanduhrzeit auf die einer bestimmten Zeitzone.
LocalDateTime
ist die falsche KlasseAndere Antworten sind korrekt, weisen jedoch nicht darauf hin, dass dies
LocalDateTime
die falsche Klasse für Ihren Zweck ist.Sowohl in java.time als auch in Joda-Time
LocalDateTime
fehlt einem absichtlich jedes Konzept der Zeitzone oder des Versatzes von UTC. Als solches ist es nicht repräsentiert einen Moment, und ist nicht ein Punkt auf der Timeline. ALocalDateTime
repräsentiert eine grobe Vorstellung von möglichen Momenten in einem Bereich von etwa 26 bis 27 Stunden.Verwenden Sie a
LocalDateTime
für, wenn die Zone / der Versatz unbekannt ist (keine gute Situation) oder wenn der Zonenversatz unbestimmt ist. Zum Beispiel würde "Weihnachten beginnt im ersten Moment des 25. Dezember 2018" als dargestelltLocalDateTime
.Verwenden Sie a
ZonedDateTime
, um einen Moment in einer bestimmten Zeitzone darzustellen. Zum Beispiel Weihnachten, das in einer bestimmten Zone beginntPacific/Auckland
oderAmerica/Montreal
mit einemZonedDateTime
Objekt dargestellt wird.Verwenden Sie für einen Moment immer in UTC
Instant
.Wenden Sie eine Zeitzone an. Gleicher Moment, gleicher Punkt auf der Zeitachse, aber mit einer anderen Wanduhrzeit betrachtet.
Nein, falsche Strategie. Wenn Sie einen Nur-Datum-Wert haben und einen Datums- / Uhrzeitwert möchten, müssen Sie eine Uhrzeit angeben. Diese Tageszeit ist an diesem Datum möglicherweise nicht für eine bestimmte Zone gültig. In diesem Fall
ZonedDateTime
passt die Klasse die Tageszeit automatisch nach Bedarf an.Wenn Sie den ersten Moment des Tages als Tageszeit verwenden möchten , lassen Sie java.time diesen Moment bestimmen. Gehen Sie nicht davon aus, dass der Tag um 00:00:00 Uhr beginnt. Anomalien wie die Sommerzeit (DST) bedeuten, dass der Tag möglicherweise zu einer anderen Zeit beginnt, z. B. um 01:00:00 Uhr.
java.sql.Timestamp
ist die falsche KlasseDas
java.sql.Timestamp
ist Teil der problematischen alten Datums- / Uhrzeitklassen , die jetzt Legacy sind und vollständig durch die Klassen java.time ersetzt werden. Diese Klasse wurde verwendet, um einen Moment in UTC mit einer Auflösung von Nanosekunden darzustellen . Diesem Zweck wird jetzt gedientjava.time.Instant
.JDBC 4.2 mit
getObject
/setObject
Ab JDBC 4.2 und höher kann Ihr JDBC-Treiber java.time-Objekte direkt mit der Datenbank austauschen, indem er Folgendes aufruft:
PreparedStatement::setObject
ResultSet::getObject
Beispielsweise:
… und …
Vermächtnis ⬌ modern umwandeln
Wenn Sie mit altem Code arbeiten müssen, der noch nicht auf java.time aktualisiert wurde , konvertieren Sie mit neuen Methoden, die zu den alten Klassen hinzugefügt wurden, hin und her.
…und…
Über java.time
Das java.time- Framework ist in Java 8 und höher integriert. Diese Klassen verdrängen die lästigen alten Legacy - Datum-Zeit - Klassen wie
java.util.Date
,Calendar
, &SimpleDateFormat
.Das Joda-Time- Projekt, das sich jetzt im Wartungsmodus befindet , empfiehlt die Migration zu den Klassen java.time .
Weitere Informationen finden Sie im Oracle-Lernprogramm . Suchen Sie im Stapelüberlauf nach vielen Beispielen und Erklärungen. Die Spezifikation ist JSR 310 .
Sie können java.time- Objekte direkt mit Ihrer Datenbank austauschen . Verwenden Sie einen JDBC-Treiber, der mit JDBC 4.2 oder höher kompatibel ist . Keine Notwendigkeit für Zeichenfolgen, keine Notwendigkeit für
java.sql.*
Klassen.Woher bekomme ich die java.time-Klassen?
Das ThreeTen-Extra- Projekt erweitert java.time um zusätzliche Klassen. Dieses Projekt ist ein Testfeld für mögliche zukünftige Ergänzungen von java.time. Sie können einige nützliche Klassen hier wie finden
Interval
,YearWeek
,YearQuarter
, und mehr .quelle
Abhängig von Ihrer Zeitzone können Sie einige Minuten verlieren (1650-01-01 00:00:00 wird 1649-12-31 23:52:58)
Verwenden Sie den folgenden Code, um dies zu vermeiden
quelle
Da Joda verblasst immer, vielleicht will jemanden konvertieren ,
LocaltDate
umLocalDateTime
in Java 8. In Java 8LocalDateTime
es eine Möglichkeit geben eine erstellenLocalDateTime
Instanz mit einLocalDate
undLocalTime
. Überprüfen Sie hier.Probe wäre,
Nur als Referenz, Um die Epoche zu erhalten, können die folgenden Sekunden verwendet werden:
quelle
LocalDateTime
überhaupt nichts verwendet werden. Dieser Klasse fehlt absichtlich jedes Konzept der Zeitzone oder des Versatzes von UTC. Es hat hier also keinen nützlichen Zweck. Stattdessen:LocalDate.parse( “20180306” , DateTimeFormatter.BASIC_ISO_DATE ).atStartOfDay( ZoneId.of( “Africa/Tunis” ).toEpochSecond()
Gehen Sie nicht davon aus, dass der Tag um 00:00 Uhr beginnt, was nicht immer der Fall ist.java.time.LocalDate.atStartOfDay
, um a zu erhaltenZonedDateTime
. Siehe Beispiele in meiner Antwort . Wie ich bereits sagte, ist dieLocalDateTime
Klasse in all dem nutzlos und kontraproduktiv.LocalDateTime
müssen wir ein verwendenZoneId
?LocalDateTime
ist für das hier vorliegende Problem nicht angemessen. ALocalDateTime
ist nicht einen Moment darstellen. ALocalDateTime
hat nichts mit einem bestimmten Ort oder einer bestimmten Zeitzone zu tun , obwohl der Name auf den ersten Blick etwas anderes implizieren kann - erfahren Sie mehr über die Absicht und Details dieser Klasse. DieLocalDateTime
Klasse erfüllt einen Zweck, aber nicht den in dieser Frage gezeigten Zweck.Funktionsaufruf
asStartOfDay()
fürjava.time.LocalDate
Objekt gibt einjava.time.LocalDateTime
Objekt zurückquelle
Java8 +
quelle