我需要以UTC格式解析字符串2015-01-15-05:00
LocalDate(或smth else)。 的问题是,下面的代码:Java 8偏移日期解析
System.out.println(LocalDate.parse("2015-01-15-05:00", DateTimeFormatter.ISO_OFFSET_DATE));
输出2015-01-15
忽略的偏移。期望的输出是2015-01-16
在此先感谢!
我需要以UTC格式解析字符串2015-01-15-05:00
LocalDate(或smth else)。 的问题是,下面的代码:Java 8偏移日期解析
System.out.println(LocalDate.parse("2015-01-15-05:00", DateTimeFormatter.ISO_OFFSET_DATE));
输出2015-01-15
忽略的偏移。期望的输出是2015-01-16
在此先感谢!
最简单的答案是使用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 – StasKolodyuk
@JodaStephen,它应该是.parseDefaulting(ChronoField.HOUR_OF_DAY,24) – StasKolodyuk
好像我找到了一个灵魂。那就是:
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());
您为什么认为结果必须是2015-01-16?很明显,你对不存在的时钟时间应该是什么样的情况(对于所有输入字符串总是相同的?)做出一个不可思议的假设。对我而言,日期正如解析:2015-01-15。 UTC没有连接,因为缺少时间部分。 –