当前位置: 首页 > 知识库问答 >
问题:

无法从TemporalAccessor获取Instant:{},ISO解析为java.time.format.parsed类型的2018-01-01

欧奇希
2023-03-14

我用以下映射创建了一个Elasticsearch(版本7.8.1)文档:

{
    "transaction": {
        "mappings": {
            "properties": {
                "_class": {
                    "type": "text",
                    "fields": {
                        "keyword": {
                            "type": "keyword",
                            "ignore_above": 256
                        }
                    }
                
                },
                "settlementEntries": {
                    "type": "nested",
                    "properties": {
                        "settlementDate": {
                            "type" : "date",
                            "format" : "uuuu-MM-dd"
                        },
                        "settlementId": {
                            "type": "long"
                        }
                    }
                },
                "transactionId": {
                    "type": "text",
                    "fields": {
                        "keyword": {
                            "type": "keyword",
                            "ignore_above": 256
                        }
                    }
                }
            }
        }
    }
}

我使用格式yyyy-MM-dd来存储SettlementDate。当我使用using curl进行查询时,我可以使用curl-x GET localhost:9200/transaction/_search查看数据。但是,当我试图通过springboot做同样的事情时,它会出现错误。我的实体是:

public class TransactionBo {

    @Id
    private String transactionId;
    @Field(type = FieldType.Nested)
    private SettlementEntryBo settlementEntries;
    
}
public class SettlementEntryBo {

    @Id
    private Long settlementId;
    @Nullable
    @Field(type = FieldType.Date, format = DateFormat.custom, pattern = "uuuu-MM-dd")
private Date settlementDate;

}
@Field(type = FieldType.Date, format = DateFormat.custom, pattern = "uuuu-MM-dd")
private Date settlementDate;

2020-09-05 02:51:18.105错误10080---[nio-8090-exec-4]O.A.C.C.C.[.[.[/].[dispatcherServlet]:servlet.Service()对于路径为[]的上下文中的servlet[dispatcherServlet]抛出异常[请求处理失败;嵌套异常为java.time.DateTimeException:无法从TemporalAccessor获取即时:{},ISO解析为具有根本原因的java.time.format.parsed类型的2016-01-01

unsupportedTemporalTypeException:不受支持的字段:InstantSeconds

共有1个答案

翟淇
2023-03-14

改变你的模式,使用uuuu而不是YYYY;这里对此进行了说明,Elasticsearch中的更改对此负责:https://www.elastic.co/guide/en/Elasticsearch/reference/current/migrate-to-java-time.html#java-time-migration-incompatible-date-formats

我看到的另一件事是:

您使用的日期格式只包含年、月和日。那是个普通的约会。但是java.util.date不是日期,而是UTC区域中的一个即时时间-包括时间戳。

因此,您应该更改属性类型java.time.localdate,就像他在评论中建议的那样。这些类是在Java8中引入的,以克服Java.util.date的所有缺陷。

 类似资料:
  • 问题内容: 使用Java 1.8.0_51时,以下代码(摘自无法从TemporalAccessor获取OffsetDateTime) 引发异常: 这次我在做什么错? 问题答案: 您忘记设置时间了。 如果将我的答案与代码进行比较,您会注意到唯一的区别是时间信息丢失。一个包含时间信息,并从当前的格式不处理它,实例不能形成即可。 您还可以在包含以下内容的stacktrace中看到它 根据您的需要,您可以

  • 问题内容: 我只是想将Java 8中的日期字符串转换为DateTime对象。运行以下行时: 我收到以下错误: 语法与此处建议的语法相同,但有例外。我正在使用JDK-8u25。 问题答案: 事实证明Java不接受裸露的Date值作为DateTime。使用LocalDate代替LocalDateTime解决了此问题:

  • 我得到以下错误: 语法与这里所建议的相同,但我有一个例外。我使用的是。

  • 我有一个以下格式的日期,我需要解析它,并转换成一个纪元时间。 关于我做错了什么有什么帮助吗?

  • 当我这样做的时候 如何解析datetime字符串,以便将其解释为始终来自时区“欧洲/柏林”?

  • 问题内容: 当我这样做时 我得到以下异常: 如何解析日期时间字符串,以便将其始终解释为来自“欧洲/柏林”时区? 问题答案: 问题在于,a 和a 之间存在差异。要创建一个,您需要一个区域偏移量。但是,a和a之间没有一对一的映射关系,因为它实际上取决于当前的夏时制时间。对于ZoneId像“欧洲/柏林”一样的商品,夏季有一个偏移量,而冬季有一个不同的偏移量。 在这种情况下,使用代替会更容易。在解析期间,