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

时间:2017-12-20 08:43:05

标签: java date datetime 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);

我的日期时间为String而没有偏移量,但需要将其解析为OffsetDateTime,我知道我需要一个偏移量,但我可以改变一下String插入默认/虚拟偏移量(可能是+00:00)&使用OffsetDateTime解析它。问题是对象必须是OffsetDateTime

2 个答案:

答案 0 :(得分:1)

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

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss");
    OffsetDateTime date = LocalDateTime.parse("2017-02-03 12:30:30", formatter)
            .atOffset(ZoneOffset.UTC);

这会得OffsetDateTime 2017-02-03T12:30:30Z,其中Z表示UTC或偏移零。

如果您愿意, 可以直接解析为OffsetDateTime

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

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

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

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

格式模式字符串中的

编辑: uuuuyyyy年份?由于这一年总是在共同时代(Anno Domini),所以要么有效。 yyyy是时代的年代,并且有一个时代指示符(如AD或BC,格式模式字母G)。 uuuu是签名年份,其中0年表示1 BCE,-1表示2 BCE等。this question: uuuu versus yyyy in DateTimeFormatter formatting pattern codes in Java?中有更多

答案 1 :(得分:0)

其实我是通过以下方式实现的:

DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
OffsetDateTime.of(LocalDateTime.parse("2017-02-03 12:30:30", FORMATTER), ZoneOffset.UTC);