【问题标题】:Parse datetime without offset in OffsetDateTime java在 OffsetDateTime java 中解析没有偏移的日期时间
【发布时间】:2018-06-02 18:27:42
【问题描述】:

我能否以某种方式使用 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);

我将 datetime 作为 String 没有偏移量,但需要将其解析为 OffsetDateTime,我知道我在这里需要一个偏移量,但我可以更改 String 以插入默认/虚拟偏移量(可能是 +00:00)并使用 OffsetDateTime 解析它。问题是对象必须是OffsetDateTime

【问题讨论】:

  • 你可以这样做:OffsetDateTime date = LocalDateTime.parse("2017-02-03 12:30:3000", FORMATTER).atOffset(ZoneOffset.UTC);
  • @peter 我通过下面的代码让它工作了一半,但它产生 2017-02-03T12:30:30+11:00 而不是 2017-02-03 12:30:30+11:00我想在DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"); OffsetDateTime date = OffsetDateTime.of(LocalDateTime.parse("2017-02-03 12:30:30.000", FORMATTER), OffsetDateTime.now().getOffset());之间摆脱T
  • 那么你应该在之后使用DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ssXXX").format(date)格式化解析的日期
  • 12:30:3000??这是什么意思?

标签: java date datetime datetime-format


【解决方案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);

这给出了2017-02-03T12:30:30ZOffsetDateTime,其中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 年,-1 表示公元前 2 年,等等。this question: uuuu versus yyyy in DateTimeFormatter formatting pattern codes in Java? 中还有更多内容

【讨论】:

    【解决方案2】:

    其实我是这样实现的:

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

    【讨论】:

      猜你喜欢
      • 2016-10-29
      • 2016-04-21
      • 1970-01-01
      • 1970-01-01
      • 2016-11-10
      • 2017-05-15
      • 1970-01-01
      • 2018-03-11
      相关资源
      最近更新 更多