2016-01-05 7 views
6

Java8以前は、JodaのDateTimeクラスを使用してタイムゾーン情報を追加しました。DateTimeとsql Timestampの間で簡単に変換できます。Java 8 ZonedDateTimeまたはOffsetDateTimeをJoda DateTimeに置き換えます

Java8に移行したら、どのクラスを置き換えるべきですか? OffsetDateTimeまたはZonedDateTime

また、私はOffsetDateTimeを使用しようとしましたが、からはTimestampに戻ることはできません。

ジョダ DateTimeTimestampコンバータの

、コードは次のようである:

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

しかしJava8ため、

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

誰もがそのことについていくつかのアイデアを持っていますか?それはジョーダDateTimeが本当に良いようです。

答えて

3

あなたはZonedDateTimeを使用することができます。 Timestampに前後に変換するために使用するサンプルコードです。

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; 
} 

データベースに日時をUTCで保存しています。

+1

SQLタイムスタンプの公式マッピングは、LocalDateTime(タイムゾーンなしのタイムスタンプ)またはOffsetDateTime(タイムゾーン付きタイムスタンプ)です。たとえば、JDBC 4 JCPのメンテナンスリリース2(https://jcp.org/en/jsr/detail?id=221 – assylias

+0

)を参照してください。ありがとう。そこには医者がいますか? – spa

+0

参照:http://stackoverflow.com/a/31749317/829571 – assylias

6

あなたが次のことを行うことができjava.timeでJava 8 APIを使用した:

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); 

あなたの規則を使用する:

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

我々は正しい、データベースがUTCであると仮定し意味?ありがとう。 – ttt

+2

はい。しかし、異なるZoneIdを使用して、対応するタイムゾーンに変更することができます。 –

2

データベースタイプがtimestamp with time zoneであると仮定します。 timestamp without timezoneの場合は、別のタイプ/変換メカニズムが必要です。

JDBC 4.2 spectimestamp with time zoneOffsetDateTimeにマッピングすることを推奨します。 OffsetDateTimejava.sql.Timestampの間の変換方法は次のとおりです。

Timestampから OffsetDateTimeから
  • Timestamp ts = ...; 
    OffsetDateTime odt = OffsetDateTime.ofInstant(ts.toInstant(), ZoneId.systemDefault()); 
    
  • TimestampからOffsetDateTimeへ:

    OffsetDateTime odt = ...; 
    Timestamp ts = Timestamp.from(odt.toInstant()); 
    
関連する問題