在 OffsetDateTime java 中解析没有偏移量的日期时间

new*_*guy 3 java datetime date datetime-format

我可以以某种方式解析没有偏移的日期时间吗OffsetDateTime.parse(....)

Java代码:

DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS XXX");
OffsetDateTime date = OffsetDateTime.parse("2017-02-03 12:30:3000", FORMATTER);
Run Code Online (Sandbox Code Playgroud)

我得到的日期时间是String没有偏移量的,但需要将其解析为OffsetDateTime,我知道我在这里需要一个偏移量,但我可以如何改变它String以插入默认/虚拟偏移量(也许+00:00)并使用OffsetDateTime. 问题是该对象必须是OffsetDateTime.

Ole*_*.V. 5

最简单的解决方案是将字符串解析为 aLocalDateTime然后进行转换:

\n
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss");\nOffsetDateTime date = LocalDateTime.parse("2017-02-03 12:30:30", formatter)\n                                   .atOffset(ZoneOffset.UTC);\n
Run Code Online (Sandbox Code Playgroud)\n

这给出了一个OffsetDateTimeof 2017-02-03T12:30:30Z,其中Z表示 UTC 或偏移量为零。

\n

如果需要,可以直接 解析为:OffsetDateTime

\n
DateTimeFormatter FORMATTER = new DateTimeFormatterBuilder()\n                  .appendPattern("yyyy-MM-dd HH:mm:ss")\n                  .parseDefaulting(ChronoField.OFFSET_SECONDS, 0)\n                  .toFormatter();\nOffsetDateTime date = OffsetDateTime.parse("2017-02-03 12:30:30", FORMATTER);\n
Run Code Online (Sandbox Code Playgroud)\n

最后,如果您需要使用问题中给出的格式化程序,则更改字符串以适应当然是一种选择。例如:

\n
DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS XXX");\nString fixedDateTimeString \n            = "2017-02-03 12:30:3000".replaceFirst("(\\\\d{2})0*$", "$1.000 +00:00");\nOffsetDateTime date = OffsetDateTime.parse(fixedDateTimeString, FORMATTER);\n
Run Code Online (Sandbox Code Playgroud)\n

正如您所看到的,在最后一个示例中,我还在用作起点的字符串中保留了太多的零,并在附加偏移量的同一操作中删除了它们。结果是一样的,2017-02-03T12:30:30Z

\n

编辑: uuuu或者yyyy格式模式字符串中的年份?由于年份始终为公元纪年(Anno Domini),因此两者都有效。yyyy代表时代年份,并且有一个时代指示符(如 AD 或 BC,格式模式字母G)。是有符号的年份,其中年份 0 表示公元前 1 年,-1 表示公元前 2 年,等等。这个问题uuuu中还有\xe2\x80\x99s 更多内容:Java 中格式化模式代码相比?uuuuyyyyDateTimeFormatter

\n