gpt4 book ai didi

java - 不支持的时间类型异常 : Unsupported field: InstantSeconds

转载 作者:搜寻专家 更新时间:2023-11-01 02:00:42 25 4
gpt4 key购买 nike

我有这段代码生成时间戳,然后进行解析。

DateTimeFormatter formatter = 
DateTimeFormatter
.ofPattern("yyyyMMdd kk:HH:ss.SSSZ")
.withLocale(Locale.getDefault())
.withZone(ZoneId.systemDefault());

Instant now = Instant.now();

String formatted = formatter.format(now);
Instant parsed = formatter.parse(formatted, Instant::from);

运行时,最后一行产生异常:

java.time.format.DateTimeParseException: Text '20180123 12:12:45.648-0500' could not be parsed: Unable to obtain Instant from TemporalAccessor: {SecondOfMinute=45, NanoOfSecond=648000000, OffsetSeconds=-18000, MilliOfSecond=648, MicroOfSecond=648000, HourOfDay=12},ISO,America/New_York resolved to 2018-01-23 of type java.time.format.Parsed

Caused by: java.time.DateTimeException: Unable to obtain Instant from TemporalAccessor: {SecondOfMinute=45, NanoOfSecond=648000000, OffsetSeconds=-18000, MilliOfSecond=648, MicroOfSecond=648000, HourOfDay=12},ISO,America/New_York resolved to 2018-01-23 of type java.time.format.Parsed

Caused by: java.time.temporal.UnsupportedTemporalTypeException: **Unsupported field: InstantSeconds**

我用 DateTimeFormatter.ISO_INSTANT 替换了格式化程序,它工作正常。产生的实际数据几乎相同。什么是脱节?

ISO_INSTANT:  2018-01-23T16:51:25.516Z
My Format: 20180119 23:59:59.999-0800

我需要使用我的格式。这里有什么问题?

最佳答案

问题是您的格式并不完全代表 Instant,因为您的格式根本没有代表分钟。格式化程序可以正确地从 Instant 开始并以您的格式输出结果,因为 Instant 具有您的格式所需的所有数据,但您的格式不具有 Instant 所需的所有数据。

尝试将您的模式更改为 yyyyMMdd kk:HH:mm:ss.SSS,您会发现您的代码现在可以正常工作了。请注意添加了 mm

如果你绝对需要一个无分钟的模式,你应该制作你自己的 TemporalQuery 来从 TemporalAccessor 中提取你需要的信息在这种情况下,我只是将分钟设置为 0:

public class MyQuery implements TemporalQuery<Instant> {

@Override
public Instant queryFrom(TemporalAccessor temporal) {
LocalDate ld = LocalDate.from(temporal);
LocalTime lt = LocalTime.of(temporal.get(ChronoField.HOUR_OF_DAY), 0, temporal.get(ChronoField.SECOND_OF_MINUTE), temporal.get(ChronoField.NANO_OF_SECOND));
return ZonedDateTime.of(ld, lt, ZoneId.systemDefault()).toInstant();
}

}

然后我们可以像这样使用这个 TemporalQuery:

public class Test {
public static void main(String[] args) {
DateTimeFormatter formatter = DateTimeFormatter
.ofPattern("yyyyMMdd kk:HH:mm:ss.SSS")
.withLocale(Locale.getDefault())
.withZone(ZoneId.systemDefault());

Instant now = Instant.now();

String formatted = formatter.format(now);
System.out.println(formatted);

Instant ld = formatter.parse(formatted, new MyQuery());
}
}

关于java - 不支持的时间类型异常 : Unsupported field: InstantSeconds,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48408688/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com