我有问题在寻找一个正确读取以下字符串中日期的java日期格式:
2012-01-17T11:53:40+00:00
如果时区为标准时间(+0000),那么此模式将有效:
yyyy-MM-dd'T'HH:mm:ssZ
但实际情况并非如此。小写字母
z
也不匹配。我有问题在寻找一个正确读取以下字符串中日期的java日期格式:
2012-01-17T11:53:40+00:00
yyyy-MM-dd'T'HH:mm:ssZ
z
也不匹配。X
代表一个ISO 8601时区。SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX");
没有一种模式,因为您的偏移量不符合标准格式。
然而,如果您更正输入字符串,您就可以解析它。
这段代码可以运行:
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);
与此页面上的某些评论相反,带有偏移量+00:00
的输入字符串确实符合ISO 8601标准。问题/限制在于早期Java版本捆绑的旧日期时间类。
OffsetDateTime
。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
请注意,OffsetDateTime
的 toString
方法返回的输出末尾有一个 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 );