time zone Elasticsearch时区问题

发现问题
创建索引,配置date类型字段
批量插入数据,格式分别为带时区信息,不带时区信息,时间戳
对数据进行聚合
对数据进行查询,分别使用带时区信息,不带时区信息,时间戳三种格式



结果
不带时区信息时间显示正常, 时间戳和带时区信息时间提前8小时



不带时区信息格式2019-07-15T08:00:00
等价于2019-07-15T08:00:00+00:00, 默认就是UTC 0时区时间, 实际存储的就是这个值



带时区信息格式2019-07-15T08:00:00+08:00
东八区时间 = UTC0时区 + 8个小时
所以实际存储的值为UTC0时区 = 东八区 - 8小时 = 2019-07-15T00:00:00+00:00, 实际存储2019-07-15T00:00:00+00:00

总结
存储:es使用UTC时间存储date类型
查询:查询的时间会转换成UTC时间,然后进行查询操作
使用建议
强制:存入es的日期类型数据,必须全部带上时区信息或者使用时间戳(可视化效果差,不建议)
强制:使用日期聚合时,必须带上时区信息
强制:查询日期类型数据是,必须带上时区信息,或者时间戳(可视化效果差,不建议)
索引中的文档存在跨时区,那么索引,聚合,查询时都需要带上时区信息
索引中的文档不存在跨时区,即全在同一时区,那么索引,聚合,查询时都不需要带上时区信息



https://blog.csdn.net/qq_28988969/article/details/96023582



日期类型
Elasticsearch提供了date类型来处理日期,但是由于JSON是没有日期类型的,所以在内部日期被转换为UTC并且存储为时间戳(带毫秒)。
插入日期时如果插入的为常规日期格式(yyyy-MM-dd或者yyyy-MM-dd’T’HH:mm:ss.SSSZ),es会自动识别日期格式,将字段类型设置为Date。如果mapping中字段类型已经确定为Date,此时插入格式化日期字符串或者时间戳(字符串和Numeric类型)时都会被Es作为日期类型存储,只不过在数据显示上和存储时的格式一致(存时间戳返回就是时间戳,字符串返回就是字符串,但是推荐存标准化的UTC时间或时间戳,避免类型不一致)。



时区问题
A:Elasticsearch默认为UTC时间,即零时区,查询时若不指定时区,则默认以0时区查询,和我们所在的东八区差8小时。yyyy-MM-dd’T’HH:mm:ss.SSSZ,这里的Z就代表UTC时区。
Es在进行日期查询/聚合时可以指定时区:



https://segmentfault.com/a/1190000015431596
https://juejin.cn/post/6844904034868920328


Category elasticsearch