今天搞监控大屏的时候,测试突然提出一个问题说,查一段时间的数据,时间曲线返回的日期有时候会比查询时间多,翻看代码后,初步定位为es的时区问题,后来将时间曲线的直方图聚合增加时区后,返回数据正确。这时忽然想到写数据的时候也没有控制时区,按说es在没有时区信息的时候会默认成UTC时间,那这样,岂不是大屏的数据都往后延迟的8小时? 通过search api 按写顺序排序,发现写入的数据时间字段竟然是正确的....
为什么写数据的时候没有带时区,通过es api查询的时候正确返回了时间?
看代码:写数据的时候,将多个NoticeRecord序列化成json字符串,通过bulk api写入
NoticeRecord noticeRecord = new NoticeRecord();
noticeRecord.setAlarmTime(new Date()); System.out.println(JSONObject.toJSONString(noticeRecord));
输出:
{"alarmTime":1696834237286,"openMonitor":false}
原来 fastjson在序列化日期字段时也会将其弄成时间戳,也就是东八区的时间戳,所有直接查询返回的时间是没有问题的
终于解决了疑问,顺道将es时间类型数据时区知识点梳理了一遍:
es时区问题汇总:
参考
Elasticsearch中的date与时区问题_es设置时区-CSDN博客
Elasticsearch-日期数据类型和时区详解_elasticsearch 日期类型-CSDN博客