2011-06-20 35 views
13

在Java中,如何解析包含不代表模式的字母的日期字符串?Java SimpleDateFormat

 
"2007-11-02T14:46:03+01:00" 
 
String date ="2007-11-02T14:46:03+01:00"; 
String format = "yyyy-MM-ddTHH:mm:ssz"; 
new SimpleDateFormat(format).parse(date); 

Exception in thread "main" java.lang.IllegalArgumentException: Illegal pattern character 'T' 
    at java.text.SimpleDateFormat.compile(SimpleDateFormat.java:769) 
    at java.text.SimpleDateFormat.initialize(SimpleDateFormat.java:576) 
    at java.text.SimpleDateFormat.(SimpleDateFormat.java:501) 
    at java.text.SimpleDateFormat.(SimpleDateFormat.java:476) 
+1

請注意,關於解析ISO 8601日期的問題是一個經常問到和回答的問題。搜索「Java ISO 8601日期」或類似的東西,你會發現很多答案。 – Jesper

+0

例如:http://stackoverflow.com/questions/6279647/converting-a-string-to-date-almost-done/6280206#6280206 – Jesper

回答

5

你試圖解析似乎是ISO 8601 format的時間。 SimpleDateFormat不幸的是,它不支持所有與ISO 8601相同的時區說明符。如果您希望能夠正確處理ISO中指定的所有表單,最好的方法是使用Joda time

這個例子是直出user guide的:

DateTime dt = new DateTime("2004-12-13T21:39:45.618-08:00"); 
+0

這不起作用,+01:00需要是+0100爲喬達工作。 – user775187

+1

@user - 你說得對,ISO版本不喜歡冒號。好消息是,你可以將冒號直接傳遞給'DateTime'構造函數。 –

19

您可以嘗試

String format = "yyyy-MM-dd'T'HH:mm:ssz"; 

參考:從Javadoc

文本可以使用報價單引號 ('),以避免解釋。

+1

它只適用於字符串包含'GMT'。就像這樣:String date =「2007-11-02T14:46:03GMT + 01:00」; –

+0

@Hendra是真的或它必須是'String date =「2007-11-02T14:46:03 + 0100」;''SimpleDateTime'是相當有限的在這種情況下,我猜如果你(OP)對輸入有很大的控制,使用像喬達時間這樣的圖書館會效果最好。 –

0
String testDate = "2007-11-02T14:46:03+01:00"; 
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssz"); 
Date date = formatter.parse(testDate); 
System.out.println(date); 

您可以嘗試類似上述

您可以使用下面link參考

+0

不,這拋出ParseException – user775187

0

如果你不關心的時區,您可以使用此方法。

public static Date convertToDate(String strDate) throws ParseException { 
    Date date = null; 
    if (strDate != null) { 
     SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); 
     date = sdf.parse(strDate); 
    } 
    return date; 
    } 

我不知道它是否對您仍然有用,但現在我遇到了同樣的問題,並且稍後我想出了這個問題。