【问题标题】:Java 8 Offset Date ParsingJava 8 偏移日期解析
【发布时间】:2016-04-21 00:04:20
【问题描述】:

我需要将以下格式的字符串 2015-01-15-05:00 解析为 UTC 中的 LocalDate(或其他)。 问题在于以下代码:

System.out.println(LocalDate.parse("2015-01-15-05:00", DateTimeFormatter.ISO_OFFSET_DATE));

输出2015-01-15 忽略偏移量。所需的输出是2015-01-16

提前致谢!

【问题讨论】:

  • 为什么你认为结果一定是2015-01-16?显然,您对不存在的时钟时间应该是什么样子做出了一个不为人知的假设(对于所有输入字符串总是相同的???)。对我来说,日期就像解析:2015-01-15。由于缺少时间部分,与 UTC 没有联系。

标签: java java-8 timezone-offset java-time


【解决方案1】:

似乎我找到了解决方案。这里是:

TemporalAccessor temporalAccessor = DateTimeFormatter.ISO_OFFSET_DATE.parse("2015-01-15-05:00");
ZonedDateTime zonedDateTime = ZonedDateTime.of(LocalDate.from(temporalAccessor), LocalTime.MAX, ZoneId.from(temporalAccessor));
System.out.println(zonedDateTime.withZoneSameInstant(ZoneOffset.UTC).toLocalDate());

【讨论】:

    【解决方案2】:

    最简单的答案是使用OffsetDateTime来表示数据,但需要默认时间:

    DateTimeFormatter fmt = new DateTimeFormatterBuilder()
        .append(DateTimeFormatter.ISO_OFFSET_DATE)
        .parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
        .toFormatter();
    OffsetDateTime dt = OffsetDateTime.parse("2015-01-15-05:00", fmt);
    LocalDate date = dt.withOffsetSameInstant(ZoneOffset.UTC).toLocalDate();
    

    ZonedDateTime 在处理时区时很有用,但当您只处理偏移量时,OffsetDateTime 更简单。

    一般来说,应用程序代码不应包含TemporalAccessor 类型的变量。如果您看到这一点,通常会有更好的方法。

    【讨论】:

    • 直接权威。感谢您的指导!
    • @JodaStephen,它仍然输出 2015-01-15
    • @JodaStephen,应该是 .parseDefaulting(ChronoField.HOUR_OF_DAY, 24)
    • 你显然需要一天结束,所以 24 有意义。我会将示例保留为 0,因为可能大多数用户会选择一天的开始。
    猜你喜欢
    • 2016-10-29
    • 1970-01-01
    • 1970-01-01
    • 2018-06-02
    • 1970-01-01
    • 2015-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多