问题
在es + kibana环境下,使用java8的时间类型LocalDateTime对应es中date类型的索引,发现在kibana中显示的时间比正常时间晚8小时,比如LocalDateTime为2018-07-18T10:00:00.000,但是kibana中显示的时间是2018-07-18T18:00:00.000,两者相差8小时。
说明
es官方文档说明,es内部会将没有标明时区的时间全部当做UTC时间,所以入参的LocalDateTime(2018-07-18T10:00:00.000)内部没有时区信息,es转化为UTC时间2018-07-18T10:00:00.000+00:00。而kibana根据浏览器所在地区确定时间,所以kibana内部显示东八区时间,所以显示的是2018-07-18T18:00:00.000+08:00
解决
使用带时区的时间类型ZonedDateTime取代LocalDateTime,并且设置jackson转换格式
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ",
locale = "zh", timezone = "GMT+8")
private ZonedDateTime insertTime;
同时修改mapping
"insertTime": {
"type": "date",
"format": "yyyy-MM-dd'T'HH:mm:ss.SSSZZ"
}
es和kibana都会使用指定的东八区时间
注意:使用jackson序列化java.time包下面的时间类型时,需要添加Module
objectMapper = new ObjectMapper();
objectMapper.registerModule(new JavaTimeModule());