Java日期格式模式

5

我有问题在寻找一个正确读取以下字符串中日期的java日期格式:

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

如果时区为标准时间(+0000),那么此模式将有效:
yyyy-MM-dd'T'HH:mm:ssZ

但实际情况并非如此。小写字母 z 也不匹配。
4个回答

6
将最后一个冒号替换为空字符串,然后解析。有时候,最简单的解决方案就是最好的解决方案。

3
Java 7中,你可以使用字母X代表一个ISO 8601时区
SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX");

我没有使用Java 7,但这个答案是正确的。这是一种非标准格式,不能直接解析(正如@Bohemian所提到的)。一旦使用Java 7,这将会有很大帮助! - mana

2

没有一种模式,因为您的偏移量不符合标准格式。

然而,如果您更正输入字符串,您就可以解析它。
这段代码可以运行:

String input = "2012-01-17T11:53:40+00:00";
input = input.replaceAll(":(..)$", "$1"); // lose the last colon
Date date = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ").parse(input);

0

与此页面上的某些评论相反,带有偏移量+00:00的输入字符串确实符合ISO 8601标准。问题/限制在于早期Java版本捆绑的旧日期时间类。

java.time

在Java 8及更高版本中,请使用java.time框架而不是那些旧类。
我们的输入字符串中只有UTC偏移量,没有完整的时区名称。因此,我们将此字符串解析为OffsetDateTime
您的输入字符串已经采用了标准的ISO 8601格式,并且java.time默认使用ISO 8601格式,因此无需指定编码解析模式。我们可以让OffsetDateTime直接解析。只需要一行简短的代码。
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

请注意,OffsetDateTimetoString 方法返回的输出末尾有一个 Z。这个 Z 是代表“Zulu”的缩写,意味着UTC 偏移量为零,即 +00:00

指定时区

如果需要,您可以将此 OffsetDateTime 调整为特定的时区,创建一个 ZonedDateTime 对象。

ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime zdt = odt.atZoneSameInstant ( zoneId );

OffsetDateTime 对象和 ZonedDateTime 对象都代表时间线上的相同时刻。区别在于当一个人抬头看她的办公室墙上的时钟时,她可能会如何体验那一刻。在蒙特利尔,她会看到“上午6:53”,而在冰岛(使用UTC时间)的同事在同时刻抬头看到的是“上午11:53”。

转储到控制台。

System.out.println ( "input: " + input + " odt: " + odt + " zdt: " + zdt );

输入:2012-01-17T11:53:40+00:00 ODT:2012-01-17T11:53:40Z ZDT:2012-01-17T06:53:40-05:00[美洲/蒙特利尔] 请注意,java.time通过在方括号中附加时区名称来扩展ISO 8601格式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接