Java8偏移日期解析
我需要将以下格式的字符串Java8偏移日期解析,java,java-8,timezone-offset,java-time,Java,Java 8,Timezone Offset,Java Time,我需要将以下格式的字符串2015-01-15-05:00解析为UTC中的LocalDate(或smth else)。 问题在于以下代码: System.out.println(LocalDate.parse("2015-01-15-05:00", DateTimeFormatter.ISO_OFFSET_DATE)); 输出2015-01-15忽略偏移量。所需输出为2015-01-16 提前谢谢 看来我找到了解决办法。这是: TemporalAccessor temporalAccessor
2015-01-15-05:00
解析为UTC中的LocalDate(或smth else)。
问题在于以下代码:
System.out.println(LocalDate.parse("2015-01-15-05:00", DateTimeFormatter.ISO_OFFSET_DATE));
输出2015-01-15
忽略偏移量。所需输出为2015-01-16
提前谢谢 看来我找到了解决办法。这是:
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());
最简单的答案是使用
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\u OF_DAY,24)您显然需要一天的结束,所以24是有意义的。我将把这个示例保留为0,因为大多数用户可能会选择开始一天。为什么您认为结果必须是2015-01-16?显然,您对不存在的时钟时间应该是什么样的做出了一个不言而喻的假设(对于您所有的输入字符串总是相同的??)。对我来说,日期就像解析的一样:2015-01-15。由于缺少时间段,无法连接到UTC。