2017-05-07 50 views
1
public static void main(String[] args) { 

    LocalDateTime ldt = LocalDateTime.now(); 

    ZonedDateTime zdt = ZonedDateTime.of(ldt, ZoneId.systemDefault()); 

    Instant instant = Instant.from(zdt); 

    Timestamp timestamp = Timestamp.from(instant); 

    System.out.println(ldt + "\n"); 

    System.out.println(zdt + "\n"); 

    System.out.println(instant + "\n"); 

    System.out.println(timestamp + "\n"); 
} 

而且它打印:如何製作java.sql.Timestamp UTC時間?

2017-05-07T18:13:26.969 

2017-05-07T18:13:26.969-04:00[America/New_York] 

2017-05-07T22:13:26.969Z 

2017-05-07 18:13:26.969 

我怎樣才能使一個SQL Timestamp保存與同時爲Instant?我需要能夠從任何地方獲得Timestamp,並將其轉換爲任何時間碰巧在世界的那個地方。問題是,無論我的系統時鐘發生什麼情況,它都會一直保存。

回答

4

您最好從LocalDateTime獲取Timestamp,而不是從Instant

的第一步是把你ZonedDateTime,並將其轉換爲GMT:

ZonedDateTime gmt = zdt.withZoneSameInstant(ZoneId.of("GMT")); 

然後你就可以將它通過轉換爲Timestamp一個LocalDateTime

Timestamp timestamp = Timestamp.valueOf(gmt.toLocalDateTime()); 
+0

這有幫助。 「即時」完全是欺騙性的,因爲它會打印當前的UTC時間,但當轉換爲「時間戳」時,顯示當地時間。所以當它保​​存到遠程數據庫時,無論我在哪裏,它都會在哪裏。我得到一個'Timestamp'沒有時區,而'Instant'是一個時期的偏移量,但如果'Timestamp'記錄當前時間爲當地時間而不是當前UTC時間,那麼這是完全沒有用的。這是一個很難提出的問題,因爲每個人都自動假設我認爲它應該顯示一個時區。 – DayTripperID

+0

這似乎也幫助我解決Timestamp本地時間轉換問題。我不知道這是否過度轉換,但是下面的鏈將存儲的UTC長度轉換爲UTC格式,並通過LDT而非Instant轉換爲時間戳:'Timestamp.valueOf( \t \t LocalDateTime。 ofEpochSecond(longEpochVal,0,ZoneOffset.UTC))' –

0

您可能需要使用如果要表示「TIMESTAMP WITH TIME ZONE」值,則需要使用Calendar對象的特定的過載setTimestamp