2011-06-08 16 views
2

可能重複:
Converting ISO8601-compliant String to java.util.Date將字符串轉換爲日期,幾乎完成!

我想這個字符串轉換:

2011-06-07T14:08:59.697-07:00 

到Java日期,到目前爲止,這是我做的:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.S"); 
Date date1 = sdf.parse("2011-06-07T14:08:59.697", new java.text.ParsePosition(0)); 

幾乎一切都很好,除了最重要的部分,時區 !! SimpleDateFormat的問題在於它預計在+/-hhmm中的TimeZone和我的格式爲+/-hh:mm

而且,我不知道爲什麼,這個工程:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.S Z"); 
Date date1 = sdf.parse("2011-06-07T14:08:59.697 -0700", new java.text.ParsePosition(0)); 

但這並不(時區前的空格):

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SZ"); 
Date date1 = sdf.parse("2011-06-07T14:08:59.697-0700", new java.text.ParsePosition(0)); 

什麼是轉換格式正確這個日期2011-06-07T14:08:59.697-07:00到java日期?

感謝您的幫助!

+0

http://stackoverflow.com/questions/909022/whats-the-best-way-to-parse-an-xml-datetime-in-java/5732733#5732733 – 2011-06-08 13:47:52

+0

(我會說這是一個確切的重複,另一個問題也必須在ISO8601時區處理冒號問題) – 2011-06-08 13:50:39

+0

Oups,對不起。我應該關閉它還是標記它? – 2011-06-08 13:52:11

回答

4

這看起來像ISO 8601標準的日期和時間格式,因爲它在XML中使用。不幸的是,Java的SimpleDateFormat不能正確支持這種格式,因爲它無法處理時區中的冒號。

但是,javax.xml包中包含可處理此格式的類。

String text = "2011-06-07T14:08:59.697-07:00"; 
XMLGregorianCalendar cal = DatatypeFactory.newInstance().newXMLGregorianCalendar(text); 

如果你需要它作爲一個java.util.Calendar那麼你可以調用它toGregorianCalendar()

Calendar c2 = cal.toGregorianCalendar(); 

而且ofcourse你可以得到一個java.util.Date出來的是:

Date date = c2.getTime(); 

你也可以使用流行的Joda Time庫,它本身支持這種格式(並且具有更好的API來處理日期和時間比Java標準庫)。

+0

請注意,自從Java 7以後,SimpleDateFormat確實支持ISO 8601時區和'X'格式字符。所以你可以使用格式:'yyyy-MM-dd'T'HH:mm.ss.SSSX' – Jesper 2014-01-24 13:14:44

2

S的問題是它會產生三位毫秒,但不會解析三位數字。

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); 
System.out.println(sdf.parse("2011-06-07T14:08:59.697-0700")); 

打印

Tue Jun 07 22:08:59 BST 2011 

看樣子你需要刪除:的時區。

0

它看起來像DateFormat無法找到毫秒的結束和時區的開始。 正則表達式來拯救!

這是一個解決辦法:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.S Z"); 
    Date date1 = sdf.parse("2011-06-07T14:08:59.697-0700".replaceAll("(?=.{5}$)", " ")); 

正則表達式把一個空間中,且該代碼的執行沒有錯誤。

3

Java SimpleDateFormat在時區信息中不支持冒號。您應該使用其他實現,例如JodaTime。如果需要的話

String dateString = "2011-06-07T14:08:59.697-07:00"; 
String pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"; 
DateTimeFormatter dtf = DateTimeFormat.forPattern(pattern); 
DateTime dateTime = dtf.parseDateTime(dateString); 
System.out.println(dateTime); 

的Maven pom.xml的依賴:

用法示例

<dependency> 
<groupId>joda-time</groupId> 
<artifactId>joda-time</artifactId> 
<version>1.6.2</version> 
</dependency> 

希望它能幫助。