-2

尝试使用threeten 将字符串转换为 ZonedDateTime 时出现 DateTimeParseException。我不确定此字符串格式的正确格式模式是什么?2014-04-16T00:00+02:00[欧洲/柏林]。有人能告诉我正确的模式是怎样的吗?

在站点注释上:是否有某个页面或某个资源可以在某处查找这些内容而无需自己重建?

谢谢!

4

1 回答 1

3

不需要格式化程序:您的格式是ZonedDateTime. ZonedDateTime两者都将此格式解析并打印为默认格式,即没有任何显式格式化程序。

    String s = "2014-04-16T00:00+02:00[Europe/Berlin]";
    ZonedDateTime zdt = ZonedDateTime.parse(s);
    System.out.println("Parsed into " + zdt);

输出:

解析为 2014-04-16T00:00+02:00[欧洲/柏林]

该格式是从 ISO 8601 格式扩展而来的。ISO 8601 将是2014-04-16T00:00+02:00唯一的,因此包括 UTC 偏移量但不包括时区。java.time 的开发人员对其进行了扩展以包含时区 ID。

如果你想要一个格式化程序:如果你有一个特殊的原因想要一个格式化程序,也许你需要将一个传递给一个方法,或者你只是想明确你期望的格式,一个是内置的:DateTimeFormatter.ISO_ZONED_DATE_TIME. 所以你仍然不需要编写任何格式模式字符串。

在哪里可以找到这些信息?它在 java.time 类的文档中。请参阅下面的文档链接。

您自己的代码:感谢您在此答案下的评论中提供您自己的代码。对于其他读者,我在这里重复一遍,为了可读性而格式化。

fun parseZonedDateTimeToString(date: ZonedDateTime): String {
    return DateTimeFormatter.ISO_ZONED_DATE_TIME.format(date)
}

fun parseStringToZonedDateTime(dateString: String): ZonedDateTime {
     return ZonedDateTime.parse(dateString, DateTimeFormatter.ISO_ZONED_DATE_TIME)
} 

链接

  • 维基百科文章:ISO 8601
  • 文档链接:
    • ZonedDateTime.parse()指定“文本字符串,例如”的单参数2007-12-03T10:15:30+01:00[Europe/Paris]</li>
    • ZonedDateTime.toString()承诺“a String,例如2007-12-03T10:15:30+01:00[Europe/Paris]”</li>
    • DateTimeFormatter使用内置格式化程序以及格式化模式字符串中使用的模式字母
    • DateTimeFormatter.ISO_ZONED_DATE_TIME, “类似于 ISO 的日期时间格式化程序,它格式化或解析带有偏移量和区域的日期时间,例如 '2011-12-03T10:15:30+01:00[Europe/Paris]'。”</li >
    • 由于上面的链接指向 Java 10 版本的类的文档,这并不总是与 backport 的文档相同,因此这里是ThreeTen backport 1.4.2 API的文档,您可以在其中找到以上所有内容项目太。
于 2020-04-04T18:46:41.010 回答