簡體   English   中英

Java Date對象的解析精度在SimpleDateFormat上關閉

[英]Java Date object parsing precision is off on SimpleDateFormat

我有一個日期作為字符串2016-10-07T12:46:23Z ,使用SimpleDateFormat解析為Date對象后,將其轉換為Fri Oct 07 08:46:22 EDT 2016 ,精確度為1秒。 調試該代碼后,它解析為Fri Oct 07 08:46:22.998 EDT 2016

SimpleDateFormat解析如下

DATE_FORMAT_ISO8601 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'")
DATE_FORMAT_ISO8601.setTimeZone(new SimpleTimeZone(SimpleTimeZone.UTC_TIME, "UTC"));

和解析的代碼看起來像

String dateStr = valuesArray.getString(0); values[0] = RESTUtils.DATE_FORMAT_ISO8601.parse(dateStr);

解析后如何獲得正確的秒值的任何提示?

表達式new SimpleTimeZone(SimpleTimeZone.UTC_TIME, "UTC")) 定義的偏移量不為零,而是2毫秒 ,請參閱Javadoc ,從而解釋了“ Fri Oct 07 08:46:22.998 EDT 2016”的觀察結果。

常量SimpleTimeZone.UTC並非旨在指示偏移量(強制作為SimpleTimeZone -constructor的第一個參數)。 它的數值“ 2”是一種表示如何解釋其他構造函數的開始或結束時間參數的模式。

因此,解釋輸入中的尾隨“ Z”(零偏移量的ISO-8601表示法)的正確解決方案是:

DATE_FORMAT_ISO8601.setTimeZone(TimeZone.getTimeZone("GMT"));

或者,如果您確實要使用類SimpleTimeZone

DATE_FORMAT_ISO8601.setTimeZone(new SimpleTimeZone(0, "UTC"));

如果您使用的是Java-8 ,也可以執行以下操作:

Instant instant = Instant.parse("2016-10-07T12:46:23Z");
System.out.println(instant); // 2016-10-07T12:46:23Z
System.out.println(Date.from(instant)); // Fri Oct 07 14:46:23 CEST 2016

當您使用SimpleTimeZone將時區添加為UTC時,您會看到第二個差異,如果您對此部分進行注釋,您將獲得准確的秒數。

String str = "2016-10-07T12:46:24Z";
SimpleDateFormat DATE_FORMAT_ISO8601 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
// DATE_FORMAT_ISO8601.setTimeZone(new SimpleTimeZone(SimpleTimeZone.UTC_TIME, "UTC"));
System.out.println(DATE_FORMAT_ISO8601.parse(str));

SimpleTimeZone並不用於定義時區。 根據文檔

SimpleTimeZone是TimeZone的具體子類,它代表與格里高利歷一起使用的時區。 該類包含GMT的偏移量(稱為原始偏移量)以及夏令時時間表的開始和結束規則。 由於每個值僅包含一個值,因此它不能處理GMT偏移量和夏令時的歷史變化,只是setStartYear方法可以指定夏令時開始生效的年份。

設置時區的正確方法是執行以下操作

DATE_FORMAT_ISO8601.setTimeZone(TimeZone.getTimeZone("UTC"));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM