2013-03-19 15 views
5

我在此網站上追蹤了其他幾個解決方案,並且沒有安裝Joda Time,但我仍然爲此感到失望。使用DateFormat.parse()的可解析日期

我也嘗試刪除冒號,如一個解決方案所述,但沒有幫助。

currentNode.getProperty("jcr:created").getString() = 2013-03-07T11:57:08.596-05:00

我得到這個錯誤:java.text.ParseException:無法解析的日期:「2013-03-07T11:57:08.596 -05:00"

<%@page import=" 
    java.util.Date, 
    java.text.SimpleDateFormat, 
    java.text.DateFormat" 
%> 
<% 
    DateFormat outputFormat = new SimpleDateFormat("MMMM dd, yyyy"); 
    DateFormat inputFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); 
    String currentDate = currentNode.getProperty("jcr:created").getString(); 
    Date date = inputFormat.parse(currentDate); // <-- Failing here 
    String currentDateString = outputFormat.format(date); 
%> 
+2

相關:http://stackoverflow.com/a/2202300/738746 – 2013-03-19 17:20:56

回答

12

區格式化爲Z的時間應該是-0500,不-05:00

所以我建議你用

DateFormat inputFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX"); 

有關可用格式的詳細信息,請參閱SimpleDateFormat's javadoc更換

DateFormat inputFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); 

如果您的jdk不允許使用X模式,則必須修復輸入字符串以刪除:。這可以用正則表達式來完成:

currentDate = currentDate.replaceAll(":(\\d\\d)$", "$1") 
+0

java.lang.IllegalArgumentException異常:非法模式字符 'X' – 2013-03-19 17:03:10

+0

什麼是你的JDK?我用Java 7測試了它,它工作正常。 – 2013-03-19 17:03:38

+6

「X」模式是Java 7的新增功能。 – Perception 2013-03-19 17:08:01

0

儘管這個問題已經回答了,有一種替代的方式來實現的解決方案,如果你的要求是隻顯示創建的格式「MMMM DD的日期, YYYY」。

Property對象有一個getDate()方法,它返回一個Calendar對象,從該對象可以使用getTime()獲取日期對象。

所以,上面這段代碼,如果重寫如下所示,將工作。

<%@ page import="java.util.Calendar, 
    java.text.SimpleDateFormat, 
    java.text.DateFormat" %> 
<% 
DateFormat outputFormat = new SimpleDateFormat("MMMM dd, yyyy"); 
Calendar currentDate = currentNode.getProperty("jcr:created").getDate(); 
String currentDateString = outputFormat.format(currentDate.getTime()); %> 

因此,它將消除將字符串轉換爲日期然後執行其餘操作的需要。希望這可以幫助。

1

由醉酒機器人測試解決方案後,我看到有半小時時區不工作,像-0530 (India).

因此,因此改進的答案是:

DateFormat inputFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); 

注意在增加XX結束,現在還有幾分鐘都要考慮在內。