TL;博士
OffsetDateTime odt = OffsetDateTime.parse ("2016-08-18 14:27:15.103+02" , DateTimeFormatter.ofPattern ("yyyy-MM-dd HH:mm:ss.SSSX")) ;
詳細
的Answer by greg-449是關於問題(使用了日期時間值的日期,僅對象),但不是解決正確。
該答案使用LocalDateTime
,這會不必要地丟棄有關offset-from-UTC的寶貴信息。 A LocalDateTime
確實不是代表時間線上的特定時刻,只是關於可能時刻的模糊想法,取決於調整到特定時區。
+02
是offset-from-UTC,意思是「比UTC提前兩小時」。因此,在UTC時間內,同時一刻的時間是12小時,比14小時少2小時。這確實代表時間線上的特定時刻。這個抵消是你拋棄LocalDateTime
而不是OffsetDateTime
的寶貴信息。
字符串格式採用SQL格式,接近標準ISO 8601格式。僅僅用T
替換中間的空格。 java.time類默認使用ISO 8601格式,因此不需要指定格式化模式。
String input = "2016-08-18 14:27:15.103+02";
String inputModified = input.replace (" " , "T");
不幸的是,爪哇8具有在解析縮寫爲只是一個小時的偏移值或偏移值省略小時和分鐘之間的冒號的錯誤。在Java 9中已修復。但在Java 8中,我們需要調整輸入。
// Workaround for Java 8 where 2-digit offset fails parsing. Fixed in Java 9.
int lengthOfAbbreviatedOffset = 3;
if (inputModified.indexOf ("+") == (inputModified.length() - lengthOfAbbreviatedOffset)) {
// If third character from end is a PLUS SIGN, append ':00'.
inputModified = inputModified + ":00";
}
if (inputModified.indexOf ("-") == (inputModified.length() - lengthOfAbbreviatedOffset)) {
// If third character from end is a PLUS SIGN, append ':00'.
inputModified = inputModified + ":00";
}
現在解析。
OffsetDateTime odt = OffsetDateTime.parse (inputModified);
轉儲到控制檯。請注意我們如何將+02
轉換爲+02:00
。
System.out.println ("input: " + input + " | inputModified: " + inputModified + " | odt: " + odt);
input: 2016-08-18 14:27:15.103+02 | inputModified: 2016-08-18T14:27:15.103+02:00 | odt: 2016-08-18T14:27:15.103+02:00
或者,指定的格式設置模式。使用這種格式化模式時,偏移解析錯誤不會引起誤解。
DateTimeFormatter f = DateTimeFormatter.ofPattern ("yyyy-MM-dd HH:mm:ss.SSSX");
OffsetDateTime odt = OffsetDateTime.parse (input , f);
數據庫
從Postgres來了,你要檢索值的日期時間對象,而不是字符串。
如果您的JDBC驅動程序符合JDBC 4.2,則可以撥打ResultSet::getObject
以獲得Instant
或OffsetDateTime
。如果沒有,請致電ResultSet::getTimestamp
以獲得java.sql.Timestamp
,然後通過在時間戳對象上調用toInstant
立即轉換爲java.time。
堅持與java.time爲您的業務邏輯;簡要使用java.sql類型,僅用於與數據庫交換。
我認爲是日期和時間之間的空間。這是一個空間字符還是一個不間斷的空間?如果你的字符串來自某種形式的表單,那麼它可能與空間不同,而不是字符 –
它來自Postgre數據庫 –