我對java時間的時間處理感到困惑。我這麼長時間的工作假設,如果一個時間戳被指定爲祖魯時間,java會照顧當地時間的偏移量。與Java時間解析混淆UTC
舉例說明。我目前在BST中有UTC +1的偏移量。考慮到這一點,我希望這個祖魯時間:
2016-09-12T13:15:17.309Z
是
2016-09-12T14:15:17.309
LocalDateTime解析之後。這是因爲我的默認系統時間設置爲BST,而上述時間戳(祖魯時間)指定它是UTC時間。
而是然而考慮這個示例:
String ts = "2016-09-12T13:15:17.309Z";
LocalDateTime parse = LocalDateTime.parse(ts, DateTimeFormatter.ISO_DATE_TIME);
System.out.println(parse);
這將打印:
2016-09-12T13:15:17.309
所以時間戳,解析爲一個LocalDateTime,不被識別爲UTC時間,而不是爲本地時間直接進行處理。 所以我想,也許我需要將其解析爲ZonedDateTime並專門將其轉換爲LocalDateTime以獲得正確的本地時間。有了這個測試:
String ts = "2016-09-12T13:15:17.309Z";
ZonedDateTime parse = ZonedDateTime.parse(ts, DateTimeFormatter.ISO_DATE_TIME);
System.out.println(parse);
System.out.println(parse.toLocalDateTime());
我得到的輸出:
2016-09-12T13:15:17.309Z
2016-09-12T13:15:17.309
兩個日期相同的輸出。
正確解析這是我能找到的唯一方法,就是:
String ts = "2016-09-12T13:15:17.309Z";
Instant instant = Instant.parse(ts); // parses UTC
LocalDateTime ofInstant = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
System.out.println(instant);
System.out.println(ofInstant);
此打印:
2016-09-12T13:15:17.309Z
2016-09-12T14:15:17.309
這是正確的。
所以問題(S)是:
- 應該不是Java的時間認識一個UTC時間戳,並將其解析到正確的系統默認?
- 如何使用
LocalDateTime#parse
方法獲得正確的結果? - 現在我應該使用
Instant
來放棄所有的解析嗎?
的問題是,jersey/jackson
的Java模塊時使用解析ISO格式和定期LocalDateTime#parse
方法的時間戳。我意識到我的時代沒有關閉,因爲他們被視爲LocalTime
,而事實上他們在祖魯時間。
你的例子看起來像它會做我的例子3的即時對話。你是對的,我誤解了什麼LocalDateTime代表。呃.. timezones :)謝謝 – pandaadb
啊,所以ZonedDateTime將時區識別爲「Z」,它自動解釋爲UTC(正是我想要的) - 是嗎? – pandaadb
@pandaadb是的,這可能只是寫這個的另一種方式。 –