我正在尝试转换ISO 8601 http://en.wikipedia.org/wiki/ISO_8601格式化字符串为java.util.Date
.
我找到了模式yyyy-MM-dd'T'HH:mm:ssZ
如果与区域设置一起使用,则符合 ISO8601 标准(比较示例)。
然而,使用java.text.SimpleDateFormat
,我无法转换正确格式的字符串2010-01-01T12:00:00+01:00
。我必须先将其转换为2010-01-01T12:00:00+0100
,没有冒号。
所以目前的解决方案是
SimpleDateFormat ISO8601DATEFORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", Locale.GERMANY);
String date = "2010-01-01T12:00:00+01:00".replaceAll("\\+0([0-9]){1}\\:00", "+0$100");
System.out.println(ISO8601DATEFORMAT.parse(date));
这显然不太好。我错过了什么还是有更好的解决方案?
Answer
感谢JuanZe的评论,我找到了乔达时间 http://www.joda.org/joda-time/魔法,它也是此处描述 http://johannburkard.de/blog/programming/java/date-time-parsing-formatting-joda-time.html.
所以,解决方案是
DateTimeFormatter parser2 = ISODateTimeFormat.dateTimeNoMillis();
String jtdate = "2010-01-01T12:00:00+01:00";
System.out.println(parser2.parseDateTime(jtdate));
或者更简单地说,通过构造函数使用默认解析器:
DateTime dt = new DateTime( "2010-01-01T12:00:00+01:00" ) ;
对我来说,这很好。
不幸的是,可用的时区格式简单日期格式 http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html(Java 6 及更早版本)不是ISO 8601 https://en.wikipedia.org/wiki/ISO_8601符合。 SimpleDateFormat 可以理解“GMT+01:00”或“+0100”等时区字符串,后者根据RFC#822 http://www.ietf.org/rfc/rfc0822.txt.
即使 Java 7 根据 ISO 8601 添加了对时区描述符的支持,SimpleDateFormat 仍然无法正确解析完整的日期字符串,因为它不支持可选部分。
使用正则表达式重新格式化输入字符串当然是一种可能性,但替换规则并不像您的问题中那么简单:
- 某些时区并非全时休息UTC https://en.wikipedia.org/wiki/Coordinated_Universal_Time,因此字符串不一定以“:00”结尾。
- ISO8601 只允许时区中包含小时数,因此“+01”相当于“+01:00”
- ISO8601 允许使用“Z”来表示 UTC,而不是“+00:00”。
更简单的解决方案可能是使用 JAXB 中的数据类型转换器,因为 JAXB 必须能够根据 XML 模式规范解析 ISO8601 日期字符串。javax.xml.bind.DatatypeConverter.parseDateTime("2010-01-01T12:00:00Z")
会给你一个Calendar
对象,如果您需要一个对象,您可以简单地使用 getTime() 对其进行Date
object.
你可能可以使用乔达时间 http://www.joda.org/joda-time/也是如此,但我不知道你为什么要为此烦恼(2022 年更新;也许是因为整个javax.xml.bind
Android 中缺少此部分javax.xml
包裹)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)