2016-01-05 63 views
6

Java8之前,我用Joda的DateTime類包括時區信息,我可以很容易地以DateTime和SQL Timestamp之間的轉換。的Java 8 ZonedDateTime或OffsetDateTime更換喬達日期時間

一旦遷移到Java8,我應該替換哪個類? OffsetDateTimeZonedDateTime

此外,我試圖使用OffsetDateTime,但它似乎不能構建回OffsetDateTime從sql 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 API 8,你可以做到以下幾點:

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 spec建議將timestamp with time zone映射到OffsetDateTime。以下是如何在OffsetDateTimejava.sql.Timestamp之間進行轉換。

  • OffsetDateTimeTimestamp

    Timestamp ts = ...; 
    OffsetDateTime odt = OffsetDateTime.ofInstant(ts.toInstant(), ZoneId.systemDefault()); 
    
  • TimestampOffsetDateTime

    OffsetDateTime odt = ...; 
    Timestamp ts = Timestamp.from(odt.toInstant()); 
    
相關問題