我在查找从字符串中正确读取此日期的java日期模式时遇到问题:
2012-01-17T11:53:40+00:00
如果时区是标准的(+0000),这种模式可以起作用:
yyyy-MM-dd'T'HH:mm:ssZ
但事实并非如此。小z
也不匹配。
答案 0 :(得分:6)
用空字符串替换最后一个冒号,然后解析。最简单的解决方案有时是最好的。
答案 1 :(得分:3)
在Java 7中,您可以使用字母X
代表ISO 8601 time zone。
SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX");
答案 2 :(得分:0)
与此页面上的一些评论相反,该输入字符串的偏移量为+00:00
is indeed in standard format,ISO 8601标准。它是与早期版本的Java捆绑在一起的旧日期时间类,它们存在问题/限制。
在Java 8及更高版本中,使用java.time框架而不是那些旧类。
我们在输入字符串中只有一个与UTC的偏移,而不是full time zone name。因此我们将此字符串解析为OffsetDateTime
。
您的输入字符串已采用标准ISO 8601格式,默认情况下java.time使用ISO 8601格式,因此无需指定编码解析模式。我们可以OffsetDateTime
班parse directly。只需一行代码。
String input = "2012-01-17T11:53:40+00:00";
OffsetDateTime odt = OffsetDateTime.parse ( input );
转储到控制台。
System.out.println ( "input: " + input + " odt: " + odt );
输入:2012-01-17T11:53:40 + 00:00 odt:2012-01-17T11:53:40Z
请注意Z
上toString
方法输出结尾的OffsetDateTime
。 Z
是Zulu
的缩写+00:00
,这意味着offset-from-UTC为零,OffsetDateTime
。
如果需要,您可以将此ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime zdt = odt.atZoneSameInstant ( zoneId );
调整为特定时区,从而创建ZonedDateTime
对象。
OffsetDateTime
ZonedDateTime
对象和System.out.println ( "input: " + input + " odt: " + odt + " zdt: " + zdt );
对象都代表时间轴上的相同时刻。不同之处在于,当一个人抬头看着她office wall to read the clock时,他可能会经历这样的一刻。在蒙特利尔,她会看到“早上6:53”,而她在冰岛的同事(使用UTC时间)会在同一时刻同时看到“上午11:53”。
转储到控制台。
npm install
输入:2012-01-17T11:53:40 + 00:00 odt:2012-01-17T11:53:40Z zdt:2012-01-17T06:53:40-05:00 [美国/蒙特利尔] < / p>
请注意,java.time通过在方括号中附加时区名称来扩展ISO 8601格式。