背景
- 使用Flink SQL把MySQL的数据同步到ES,MySQL的时间是东八区时间,同步到Elasticsearch,发现时间总是有问题。
问题
- 1、查询出来的时间总是+8小时。
解决方案:项目中jackson配置会把UTC时间转换,所以在存入时间就-8小时转成UTC时间就没毛病。
- 2、时间范围查询出来的数据不准。
解决方案:存入的时间有转换,范围查询要设置timeZone,否则查询不准。
附录
返回数据使用jackson验证过程
- 范围查询核心代码
java
// 创建时间范围查询
if (ObjectUtil.isNotEmpty(request.getCreateTimeStart()) || ObjectUtil.isNotEmpty(request.getCreateTimeEnd())) {
RangeQueryBuilder createTimeRange = QueryBuilders.rangeQuery("createTime");
// 指定时区
createTimeRange.timeZone("GMT+8");
if (ObjectUtil.isNotEmpty(request.getCreateTimeStart())) {
createTimeRange.gte(cn.hutool.core.date.DateUtil.format(request.getCreateTimeStart(), "yyyy-MM-dd HH:mm:ss"));
}
if (ObjectUtil.isNotEmpty(request.getCreateTimeEnd())) {
createTimeRange.lte(cn.hutool.core.date.DateUtil.format(request.getCreateTimeEnd(), "yyyy-MM-dd HH:mm:ss"));
}
mainQuery.filter(createTimeRange);
}
- 同步时转为
UTC时间
sql
TO_TIMESTAMP(DATE_FORMAT(res.createTime - INTERVAL '8' HOUR, 'yyyy-MM-dd HH:mm:ss')) as createTime

- 增加配置
yml
jackson:
locale: zh_CN
time-zone: GMT+8
date-format: yyyy-MM-dd HH:mm:ss
- 会使用
jackson的配置转换时间

小结
- 理解Elasticsearch 内部固定使用 UTC 时间存储所有日期类型字段。实际上这2个问题是时间没对其的缘故,存入数据转成
UTC时间,范围查询用东八区时间就没有问题。