当前位置: 首页 > 面试题库 >

UnsupportedTemporalTypeException:不支持的字段:InstantSeconds

席言
2023-03-14
问题内容

我有这段代码正在生成一个时间戳,然后解析。

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, Offhtml" target="_blank">setSeconds=-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所需的所有数据。

尝试将模式更改为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());
    }
}


 类似资料:
  • 支持字段允许 EF 直接读写字段(而不是属性)。 惯例 按照惯例,以下字段将被发现为给定属性的支持字段(按列出顺序优先)。只有包含在模型中的属性才具有支持字段。关于属性如何包含在模型中,请查看 包含和排除属性。 _<驼峰属性名> _<属性名> m_<驼峰属性名> m_<属性名> public class Blog { private string _url; public int

  • 我试图从azure key vault中为azure函数获取连接字符串。这些是我做的步骤, > 在azure函数中创建了一个托管标识(系统分配) 在azure密钥库中创建秘密 如有任何帮助,将不胜感激

  • avro.version= 在avro模式中,map type不支持缺省值。我尝试了以下不同的模式。 第一: 第二: 第三: Java代码如下: 我只希望constraintQuantities和RawQuanties为null。因为这些是可选字段。即使我没有将它们设置为null,它也会抛出异常。 最重要的是,方法生成java POJO,但无法构建该对象。 如果不设置它们为空,然后接收以下异常:

  • 我试图解析下面的processingdate,以便最终得到格式为2020-11-10T10:43:07 00:00的日期。我如何修改以下内容以产生此结果?

  • 在我的搜索引擎中,用户可以选择搜索大小写敏感或不敏感。如果他们选择这样做,查询将搜索使用自定义区分大小写分析器的字段。这是我的设置: 获取/candidates/_settings 因此,我从这个答案中创建了一个名为的自定义分析器。我试图定义我的,如下所示: 把/candidates/_mapping/candidate 因此,在查询区分大小写的匹配时,我可以执行以下操作: 我甚至没有进入最后一步

  • 我需要在JAX-WS中通过客户端连接到外部服务器。客户端在Wildfly 8上运行。使用Java8连接是正常的。但我在Java7中连接到服务器时遇到了问题(我尝试了u45、67、79)。服务器端安全性的属性为https://www.ssllabs.com/ssltest/analyze.html?d=app.bundesnetzagentur.de 在部分“密码套件”中有四个密码。源代码不应支持J