Java 8 偏移日期解析

9
我需要解析以下格式的字符串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

提前感谢!


1
你为什么认为结果必须是2015-01-16呢?显然,你对不存在的钟表时间做了一个未明示的假设(对于所有输入字符串总是相同???)。对我来说,日期就是解析后的: 2015-01-15。由于缺少时间部分,因此与UTC没有任何关联。 - Meno Hochschild
2个回答

9
最简单的方法是使用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类型的变量。如果你看到这种情况,通常会有更好的解决方法。


3
直接而权威。感谢指导! - Erick G. Hagstrom
@JodaStephen,它仍然输出2015-01-15。 - StasKolodyuk
@JodaStephen,应该是.parseDefaulting(ChronoField.HOUR_OF_DAY, 24)。 - StasKolodyuk
3
明显地,你需要一天的结束时间,因此24是有意义的。我将把示例保留为0,因为大多数用户可能会选择一天的开始时间。 - JodaStephen

2

看起来我找到了一个解决方案。这就是:

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());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接