使用java.text.SimpleDateFormat解析日期字符串

时间:2009-10-12 14:15:56

标签: java datetime formatting iso8601

我有一个奇怪的问题,我需要解析一个看起来像1997-02-14T00:00:00.0000000+05:30的日期字符串。关于日期字符串的奇怪之处是时区信息。它是+05:30而不是通常的+0530

我已准备好基本格式字符串yyyy-MM-dd'T'HH:mm:ss.SSSSSSSZ,如果不是TZ信息,它就像魅力一样。

有人能建议解决这个问题吗?是否有某种格式字符串可以处理这种TZ信息?

提前致谢。

7 个答案:

答案 0 :(得分:5)

我几个月前自己研究过这个问题。如果我没记错的话,SimpleDateFormat不够灵活,不能接受其他时区格式(我的是+530)。我所做的是一个简单的预处理步骤 - 即在将String传递给SimpleDateFormat之前尝试删除冒号。

答案 1 :(得分:3)

你不能用正则表达式进行预处理并替换时区,例如

String dateAndTime = ...
String preprocessed = dateAndTime.replace("([+-])(\\d\\d):(\\d\\d)$", "$1$2$3");
// Go on with your life 

答案 2 :(得分:2)

SimpleDateFormat应该接受这个。来自the doc

  

对于解析,一般时区是   也接受了。

和这些are specified as

GMTOffsetTimeZone:
             GMT Sign Hours : Minutes

看起来像你有什么?

如果失败,那么Joda DateTimeFormat声称要这样做。无论如何,我都很想使用Joda,原因有很多(更一致和更简单的API,格式化程序/解析器的线程安全等等。)

答案 3 :(得分:2)

这是偶然的XML文件(ISO8601格式)的日期字符串吗?遗憾的是,没有(简单)方法可以使用SimpleDateFormat解析此问题,这完全是由于SimpleDateFormat无法正确处理的时区部分中的“:”。

查看有关如何解析XML日期时间字符串的my answer in this other question

答案 4 :(得分:2)

当然,总有预处理你的字符串的黑客。

如果没有人找到更好的答案,那就已经有了。您可以将其封装在一个方法中,并附带注释来解释黑客攻击。

答案 5 :(得分:0)

边缘仍然很粗糙,但应该有效:

http://pastebin.com/f7bbb0b43

答案 6 :(得分:0)

我认为它应该使用replaceAll的{​​{1}}方法{/ 1}}。

String