使用SimpleDateFormat解析svn log -xml日期输出

时间:2014-05-10 10:20:48

标签: java xml svn simpledateformat java.util.date

svn log命令的xml输出的日期格式如下所示。

2014-04-24T08:51:58.213757Z

我尝试使用带有以下字符串的SimpleDateFormat将其解析为util.Date对象。

yyyy-MM-ddTHH:mm:ss.SSSSSSZ

完整方法

protected Date formatDate(String dateString) {
        //2014-04-24T08:51:58.213757Z

        DateFormat format = new SimpleDateFormat("yyyy-MM-ddTHH:mm:ss.SSS");
        format.setTimeZone(TimeZone.getTimeZone("Asia/Colombo"));
        Date date = null;
        int lengthToParse = "yyyy-MM-ddTHH:mm:ss.SSS".length();

        try {
            date = format.parse(dateString.substring(0, lengthToParse));
        } catch (ParseException e) {
            e.printStackTrace();
        }

        return date;
    }

然而,这会产生如下错误。

java.lang.IllegalArgumentException: Illegal pattern character 'T'

1 个答案:

答案 0 :(得分:4)

您需要引用T,因为您希望它与字面匹配。您还希望X作为时区的格式说明符,而不是Z

yyyy-MM-dd'T'HH:mm:ss.SSSSSSX

或者您可以将时区指定为UTC,并引用Z.

yyyy-MM-dd'T'HH:mm:ss.SSSSSS'Z'

但是,您可能仍然遇到问题,因为这会将213757解释为毫秒,而不是微秒。

我不确定用SimpleDateFormat解析微秒是一种干净的方法 - 你最好只解析子字符串:

String text = "2014-04-24T08:51:58.213567Z";
// You could just hard code the length, but this feels easier to read
String trimmed = text.substring(0, "yyyy-MM-ddTHH:mm:ss.SSS".length());
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
format.setTimeZone(TimeZone.getTimeZone("Etc/UTC");
Date date = format.parse(trimmed);

请注意,您肯定希望Etc/UTC作为时区,因为输入是UTC ...这就是字符串末尾的'Z'意味着什么。