spring数据elasticsearch自定义日期格式错误

ecbunoof  于 2021-06-10  发布在  ElasticSearch
关注(0)|答案(2)|浏览(821)

我使用的是spring data elasticsearch 4.0.1和elastic cluster 7.6,当我使用“yyyy-mm-dd”自定义模式定义属性并尝试检索值为“2014-06-11”的日期时,它会抛出一个错误。

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

错误:

java.time.DateTimeException: Unable to obtain Instant from TemporalAccessor: {},ISO resolved to 2014-06-11 of type java.time.format.Parsed

我也试过了,但又出现了一个错误:

@Field(type = FieldType.Date, format = DateFormat.date_optional_time)
private Date startDate;

我在文档中读到,我应该为elastic7版本使用模式“uuu-mm-dd”,但这也不起作用。

m3eecexj

m3eecexj1#

ElasticSearch7使用现代日期时间api。下面是一个节选自https://docs.spring.io/spring-data/elasticsearch/docs/current/reference/html/#reference
从temporalaccessor派生的属性必须具有fieldtype.date类型的@field注解,或者必须为此类型注册自定义转换器。如果您使用的是自定义日期格式,则需要使用uuuu表示年份,而不是yyyy。这是由于elasticsearch 7发生了变化。
按以下方式更改注解和类型:

@Field(type = FieldType.Date, format = DateFormat.date)
private LocalDate startDate;

在trail:date-time了解有关现代日期时间api的更多信息。
更多参考资料:
elasticsearch内置日期时间格式
日期时间格式

omtl5h9j

omtl5h9j2#

java.util.Date 不是由年、月和日组成的普通日期,而是utc时区中的时间瞬间。无法将“2014-06-11”转换为时间上的瞬间。应该用几小时几分钟?在哪个时区?
就像ole在评论中写的那样,使用 java.time.LocalDate 为了这个。这个类正是针对那个用例:一年一个月一天。请停止使用旧的 java.util.Date 班级。自Java8以来,在 java.time 包裹。

相关问题