2014-04-03 111 views
3

我爲了解析字符串中使用的SimpleDateFormat。這裏有一個例子:SimpleDateFormat的解析返回錯誤的日期

private static final SimpleDateFormat longStringFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); 
[some code here] 
Date dirDate = longStringFormat.parse("2014-04-03T06:00:00.376542900Z"); 

當我在調試模式下檢查dirDate,或打印出來,我得到的日期是Mon Apr 07 14:35:42 FET 2014

爲什麼我得到這樣的偏移?它不能算作時區偏移量(儘管應用偏移量似乎已經是錯誤的了)。如何獲取描述與String完全相同的時間的Date對象?

+0

請不要認爲Java是錯誤的。 –

+0

SSS表示毫秒值,而不是秒的幾分之一。 –

+0

@SotiriosDelimanolis =))我不認爲他們是錯誤的,我認爲我沒有正確地理解它。也許這是錯誤。你會爲我的情況建議什麼格式的字符串? – Dragos

回答

4

好了,問題是,你指定的毫秒數這個值:376542900.這104個小時,46分42秒900毫秒......因此這個問題。

不幸的是,它看起來像SimpleDateFormat沒有一種理解,你是在給它「小數秒」而不是「毫秒數」。我強烈懷疑(儘管我沒有嘗試過)Java 8可以正常工作(可能有更長的模式),Joda時間也可以處理它 - 這兩種選擇都可以嗎?否則,您需要使用字符串操作來將字符串轉換爲更易於管理的形式。

(順便說一句,你還應該設置SimpleDateFormat的時區爲UTC,因爲那正是在文本中指定。)

+0

他們都不是一個選項。除.substring()或.split()之外的其他建議? – Dragos

+1

@Dragos:我會使用'substring'去除額外的數字,基本上。 –

+0

更準確地說,SimpleDateFormat不能處理微秒。如果降低下來到小數點後3位是罰款(雖然這將導致一個不太準確的時間價值也許) – Brian