2014-02-12 162 views
-1

有下面的代碼:Java的無法解析的日期

Date st = new SimpleDateFormat("HH:mm").parse(date); 

我也得到了以下異常 「無法解析的日期: 」2000-01-01T01:00:00Z「(偏移量爲4)」。我該如何解決它?提前致謝。

+3

通過傳遞形式爲「HH:mm」的字符串? –

+0

看到[docs](http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html)..答案就在那裏。 – Maroun

+1

Whaat值有日期變量嗎? –

回答

0
Date st = new SimpleDateFormat("HH:mm").parse(date.substring(11,16)); 
0

使用這種格式來代替:

Date st = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'").parse(date); 
0

SimpleDateFormat是非常無情。它期望您傳遞一個與您初始化的格式字符串完全匹配的字符串。如果你傳遞「HH:mm」作爲格式字符串,它將無法處理任何其他格式 - 它不能處理一年中的日期等。它將處理「3:56」(在這種情況下,你1970年1月1日上午03:56在你的Date)。

0

試試這個

SimpleDateFormat dtf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); 
Date date = dtf.parse(date); 
dtf = new SimpleDateFormat("HH:mm"); 
String dateStr = dtf.format(date); 
Date finalDate = dtf.parse(date); 

希望它能幫助。

0

試試這個

new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX") 
-1

異常中的日期是XML模式日期時間。需要注意的是,只需要創建像你想象的,因爲Z表示「UTC」時區和解析器是默認初始化爲本地時間

SimpleDateFormat dtf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); 

不會完全工作。

另請注意,架構dateTime具有變量定義,它可以(可選)具有毫秒精度(0或更多毫秒),時區(如果Z以外的東西)與SimpleDateFormat格式不兼容。

簡而言之:xml日期時間對於默認庫非常棘手。我已經編寫了一個自定義解決方案來處理它們在我們的環境中,但你也可以看看我相信處理它們的joda時間庫。或者你可以等待下一個java版本,它將有一個新的日期API。

+0

**這個答案是不正確的。**圍繞'Z'放置單引號會導致字母在解析過程中被忽略。但那'Z'是重要的信息! 「Z」代表「Zulu」,並表示日期時間值在[UTC](https://en.wikipedia.org/wiki/Coordinated_Universal_Time)時區中,從00:00開始偏移「00:00」世界標準時間。單引號意味着你正在丟失信息。此外,如果一個傳入的字符串有一個偏移號碼,例如「+05:30」而不是「Z」,那麼解析將會失敗,因爲單引號表示您期望在所有輸入中出現一個字母「Z」 。 –

+0

答案並不正確,你只是讀錯了。 Z確實是重要的信息(正如我所說的,它表示UTC時區)。被引用忽略的事實對於那些瞭解班級的人來說應該是不言而喻的,這就是爲什麼我說你必須小心,因爲它會利用當地時間。 – nablex

1

TL;博士

Instant.parse("2000-01-01T01:00:00Z") 

錯誤解析模式

您定義的,說你所期望的輸入字符串是小時和分鐘的格式設置模式。但是你的輸入字符串有更多,幾年,幾個月等等。

java.time

從Java 8中和後,老java.util.Date/.Calendar和java.text.SimpleDateFormat中已經被新的取代java.time package。儘可能避免舊的課程,因爲它們被證明是令人困惑,麻煩和有缺陷的。

您的輸入字符串正在使用由ISO 8601定義的標準日期時間格式之一。幸運的是,默認情況下,java.time使用該格式。

String input = "2000-01-01T01:00:00Z" ; 
Instant instant = Instant.parse(input) ; 

一個InstantUTC基本上在時間軸上一會兒。您可以將該值調整到特定的時區(a ZoneId),從而生成ZonedDateTime對象。

ZonedId zoneId = ZoneId.of("America/Montreal") ; 
ZonedDateTime zdt = ZonedDateTime.of(instant , zoneId) ; 

如果您在ZonedDateTime叫toString,你會得到這樣的字符串:

1999-12-31T20:00:00-05:00 [美國/蒙特利爾]

ZonedDateTime類通過在括號中附加時區名稱來擴展ISO 8601格式。