2016-01-05 4 views
6

Vor Java8 habe ich Jodas DateTime-Klasse verwendet, um Zeitzoneninformationen zu integrieren, und ich kann problemlos zwischen DateTime und sql Timestamp konvertieren.Java 8 ZonedDateTime oder OffsetDateTime zum Ersetzen von Joda DateTime

Einmal nach Java8 migrieren, welche Klasse sollte ich ersetzen? OffsetDateTime oder ZonedDateTime?

Auch ich habe versucht, OffsetDateTime zu verwenden, aber es scheint nicht zu OffsetDateTime von einem sql Timestamp zurück zu konstruieren.

Für Joda DateTime und Timestamp-Wandler, ist der Code wie:

val joda = DateTime.now() 
val sqlJoda = new Timestamp(joda.getMillis) 
val jodaBack = new DateTime(sqlJoda) 

Aber für Java8,

val java8 = OffsetDateTime.now() 
val sqlJava8 = new Timestamp(java8.toInstant.toEpochMilli) 
val java8Back = ??? 

Wer eine Vorstellung davon hat? Es scheint, Joda DateTime ist wirklich gut.

Antwort

3

Sie können ZonedDateTime verwenden. Hier ist ein Beispielcode, den ich verwende, um Timestamp hin und her zu konvertieren.

public ZonedDateTime from(Timestamp timestamp) { 
    if (timestamp == null) { 
     return null; 
    } 
    final ZonedDateTime zonedDateTime = ZonedDateTime.ofInstant(timestamp.toInstant(), ZoneId.of("UTC")); 
    return zonedDateTime; 
} 

public Timestamp to(ZonedDateTime zonedDateTime) { 
    if (zonedDateTime == null) { 
     return null; 
    } 
    final Timestamp timestamp = Timestamp.valueOf(zonedDateTime.withZoneSameInstant(ZoneId.of("UTC")).toLocalDateTime()); 
    return timestamp; 
} 

Bitte beachten Sie, dass ich Datum Zeiten in der Datenbank in UTC speichern.

+1

Das offizielle Mapping eines SQL-Zeitstempels ist entweder LocalDateTime (Zeitstempel ohne Zeitzone) oder OffsetDateTime (Zeitstempel mit Zeitzone). Siehe zum Beispiel das Maintenance Release 2 von JDBC 4 JCP hier: https://jcp.org/en/jsr/detail?id=221 – assylias

+0

Wusste das nicht. Vielen Dank. Gibt es da draußen einen Arzt? – spa

+0

Siehe auch: http://stackoverflow.com/a/31749317/829571 – assylias

6

die Java verwenden 8 API in java.time Sie Folgendes tun könnte:

long ms_since_epoch = 1_500_000_000_000L; 
Instant instant = Instant.ofEpochMilli(ms_since_epoch); 

// convert milliseconds in UTC to date 
OffsetDateTime dateUTC = OffsetDateTime.ofInstant(instant, ZoneOffset.UTC); 

Arbeiten mit dem Kongress:

val java8 = OffsetDateTime.now() 
val sqlJava8 = new Timestamp(java8.toInstant.toEpochMilli) 
val java8Back = OffsetDateTime.ofInstant(sqlJava8.toInstant(), ZoneOffset.UTC); 
+0

Was bedeutet, übernehmen wir die Datenbank UTC ist, nicht wahr? Vielen Dank. – ttt

+2

Ja. Sie können es jedoch mit einer anderen ZoneId in Ihre entsprechende Zeitzone ändern. –

2

Ich nehme an, dass Ihr Datenbanktyp ein timestamp with time zone ist. Wenn es ein timestamp without timezone ist, benötigen Sie einen anderen Typ/Konvertierungsmechanismus.

Die JDBC 4.2 spec empfiehlt, eine timestamp with time zone auf eine OffsetDateTime zu mappen. So können Sie zwischen einer OffsetDateTime und einer java.sql.Timestamp konvertieren.

  • Von OffsetDateTime-Timestamp:

    Timestamp ts = ...; 
    OffsetDateTime odt = OffsetDateTime.ofInstant(ts.toInstant(), ZoneId.systemDefault()); 
    
  • Von Timestamp-OffsetDateTime:

    OffsetDateTime odt = ...; 
    Timestamp ts = Timestamp.from(odt.toInstant());