使用DateFormat.parse()的无法解析的日期

时间:2013-03-19 16:53:04

标签: java datetime simpledateformat cq5

我在这个网站上遵循了一些其他解决方案来解决这个难题,我没有安装Joda Time,但我仍然不知道为什么会失败。

正如一个解决方案所述,我也尝试去除冒号,但这没有帮助。

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);
%>

3 个答案:

答案 0 :(得分:12)

格式为Z的时区应为-0500,而不是-05:00

所以我建议你替换

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

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

有关可用格式的详细信息,请参阅SimpleDateFormat's javadoc

如果您的jdk不允许X模式,则必须修复输入字符串以删除:。这可以使用正则表达式完成:

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

答案 1 :(得分:2)

在醉酒机器人测试解决方案后,我发现半小时的时区不起作用,例如-0530 (India).

因此改进的答案是:

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

请注意最后添加的XX,现在也考虑了几分钟。

答案 2 :(得分: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()); %>

因此,它将消除将String转换为Date然后执行剩余操作的需要。希望这会有所帮助。