2017-08-16 64 views
-4
String str = "2017-08-01T15:15:03.313456768+02:00"; 
// The following statement gives IllegalArgumentExceptionTimestamp format must be yyyy-mm-dd hh:mm:ss[.fffffffff] 
Timestamp timeStamp = Timestamp.valueOf(str); 
ZonedDateTime zoneddate = ZonedDateTime.parse(str); 
System.out.println("ZonedDate: "+zoneddate);// prints 2017-08-01T15:15:03.313456768+02:00 
Instant inst = zoneddate.toInstant(); 
Timestamp newTime = Timestamp.from(inst); 
System.out.println("Timestamp: "+newTime);// prints 2017-08-01 15:15:03.313456768 without Zone 

我在轉換過程中缺少區域。任何人都可以建議我如何在TimeStamp獲得Zone?如何將字符串(2017-08-01T15:15:03.313000000 + 02:00)轉換爲時間戳

+0

我是red alredy,但SimpleDateFormat不接受9位毫秒。 – user2814979

+0

請顯示您嘗試過的代碼 – Jens

+1

'SimpleDateFormat'具有毫秒精度(小數點後只有3位數)。對於超過3位數字,您必須使用Java 8新的'java.time' API:https://stackoverflow.com/questions/30135025/java-date-parsing-with-microsecond-or-nanosecond-ccuracy – 2017-08-16 11:51:51

回答

2

這個問題的最新版本是這樣的:

任何人都可以建議我我如何在時間戳

獲得區最簡單的答案是,你不能。 A Timestamp不包含區域作爲其表示的一部分。當你轉換生成一個TimestampZonedDateTime你是扔掉時區的偏移量。

您可以通過查看Timestamp類的源代碼來驗證此情況。沒有構造函數允許您傳遞時區信息,並且日期/時間用UTC表示。 (該getTimezoneOffset()方法返回不同的東西......和方法反正棄用。)

...但我必須堅持時間戳在數據庫中,它必須有顯示的區域。

然後,您需要使用不同的SQL類型(或類型)來表示Java端的時間戳和相應的類型。請注意,SQL的某些方言不會將時區信息存儲在標準的DATE/TIME/TIMESTAMP類型中。

1

Stephen C的答案是正確的。

避免諸如java.sql.Timestamp之類的麻煩的舊日期時間類。現在由java.time類取代。

您有一個採用標準ISO 8601格式的字符串,表示日期 - 時間偏移量與UTC不同,但沒有時區指示。所以解析爲OffsetDateTime。移到UTC作爲Instant進行存儲。

檢索後,指定您希望的任何時區。

String input = "2017-08-01T15:15:03.313456768+02:00"; 
OffsetDateTime odt = OffsetDateTime.parse(input) ; 
Instant instant = odt.toInstant() ; // Adjust into UTC for storage. 
myPreparedStatement.setObject(… , instant) ; 

檢索。

Instant instant = myResultSet.getObject(… , Instant.class) ; 
ZoneId z = ZoneId.of("America/Montreal") ; // or "Europe/Berlin", "Asia/Kolkata", whatever. 
ZonedDateTime zdt = instant.atZone(z) ; // Move from UTC to a time zone. 
相關問題