Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用SimpleDataFormat解析svn日志-xml日期输出_Java_Xml_Svn_Simpledateformat_Java.util.date - Fatal编程技术网

Java 使用SimpleDataFormat解析svn日志-xml日期输出

Java 使用SimpleDataFormat解析svn日志-xml日期输出,java,xml,svn,simpledateformat,java.util.date,Java,Xml,Svn,Simpledateformat,Java.util.date,svnlog命令的xml输出的日期格式如下所示 2014-04-24T08:51:58.213757Z 我尝试使用SimpleDataFormat和以下字符串将其解析为util.Date对象 yyyy-MM-ddTHH:mm:ss.SSSSSSZ 完全法 protected Date formatDate(String dateString) { //2014-04-24T08:51:58.213757Z DateFormat format = new Si

svnlog命令的xml输出的日期格式如下所示

2014-04-24T08:51:58.213757Z
我尝试使用SimpleDataFormat和以下字符串将其解析为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'

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

yyyy-MM-dd'T'HH:mm:ss.SSSSSSX
或者您可以将时区指定为UTC,并引用Z

yyyy-MM-dd'T'HH:mm:ss.SSSSSS'Z'
但是,您可能仍然有问题,因为这将把213757解释为毫秒数,而不是微秒数

我不确定是否有一种干净的方法可以用
SimpleDataFormat
解析微秒-您最好只解析一个子字符串:

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”的意思。

谢谢!我在理解字符串的解析方面有点困难。使用上述格式字符串解析“2014-04-24T08:51:58.213”将生成一个值为“Thu Apr 24 08:52:19 IST 2014”的数据对象。我正在将时区设置为本地时区,保存此值(svn服务器位于同一时区)。我不知道为什么会出现这种差异。@Chamila:A
java.util.Date
没有时区。。。但是调用
toString()
总是在系统本地时区对其进行格式化。但我很怀疑像那样改变秒数的价值。。。不过,我刚刚注意到我的代码中有一个缺陷,这可能就是问题所在——请稍后检查。(我只是更改了子字符串调用。)我检查了我的代码,实际上包含了开始索引:)。我也对toString()进行了评估,但在几秒钟内产生了相同的差异。我计划使用Joda时间库来实现日期时间。它可以将ISO-8601格式的字符串作为输入,并且似乎没有异常行为。谢谢你的回复@查米拉:请用一个简短但完整的程序来更新你的问题。它真的应该是好的。当它将UTC转换为您的本地时区时,我希望看到小时和分钟的差异,但不是秒的差异…@Chamila:Righto,这是有道理的。它在所有方面都是一个更好的API:)