我使用的是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”,但这也不起作用。
2条答案
按热度按时间m3eecexj1#
ElasticSearch7使用现代日期时间api。下面是一个节选自https://docs.spring.io/spring-data/elasticsearch/docs/current/reference/html/#reference
从temporalaccessor派生的属性必须具有fieldtype.date类型的@field注解,或者必须为此类型注册自定义转换器。如果您使用的是自定义日期格式,则需要使用uuuu表示年份,而不是yyyy。这是由于elasticsearch 7发生了变化。
按以下方式更改注解和类型:
在trail:date-time了解有关现代日期时间api的更多信息。
更多参考资料:
elasticsearch内置日期时间格式
日期时间格式
omtl5h9j2#
一
java.util.Date
不是由年、月和日组成的普通日期,而是utc时区中的时间瞬间。无法将“2014-06-11”转换为时间上的瞬间。应该用几小时几分钟?在哪个时区?就像ole在评论中写的那样,使用
java.time.LocalDate
为了这个。这个类正是针对那个用例:一年一个月一天。请停止使用旧的java.util.Date
班级。自Java8以来,在java.time
包裹。