Java日期格式模式

时间:2012-01-18 13:58:13

标签: java

我在查找从字符串中正确读取此日期的java日期模式时遇到问题:

2012-01-17T11:53:40+00:00

如果时区是标准的(+0000),这种模式可以起作用:

yyyy-MM-dd'T'HH:mm:ssZ

但事实并非如此。小z也不匹配。

3 个答案:

答案 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 formatISO 8601标准。它是与早期版本的Java捆绑在一起的旧日期时间类,它们存在问题/限制。

java.time

在Java 8及更高版本中,使用java.time框架而不是那些旧类。

我们在输入字符串中只有一个与UTC的偏移,而不是full time zone name。因此我们将此字符串解析为OffsetDateTime

您的输入字符串已采用标准ISO 8601格式,默认情况下java.time使用ISO 8601格式,因此无需指定编码解析模式。我们可以OffsetDateTimeparse 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

请注意ZtoString方法输出结尾的OffsetDateTimeZZulu的缩写+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格式。