DistChen

ELK中Kibana组件的时间误差

当往elasticsearch插入带时间字段的数据,然后使用Kibana查询显示这些数据时,大部分人都可能会遇到Kibana显示的时间数据与elasticsearch的时间数据不一致问题(完全相同的数据),如下:

这里写图片描述

这里写图片描述

之所以会出现这个情况,是有一些原因的,这里就简单的描述下。

我们知道整个地球分为二十四时区,每个时区都有自己的本地时间。在国际无线电通信场合,为了统一起见,使用一个统一的时间,称为通用协调时(UTC, Universal Time Coordinated)。UTC与格林尼治平均时(GMT, Greenwich Mean Time)一样,都与英国伦敦的本地时相同。

北京时区是东八区,领先UTC八个小时,通过代码获取时间信息时,获取到的时间是含有时区信息的,也就是获取的本地时间,如:

1
2
System.currentTimeMillis();
new Date().getTime()

把获取到的这些本地时间写入到elasticsearch中时,存入的就是本地时间,对于我们而已,存入的就是东八区的时间,所以elasticsearch中存入的就是正确的时间,显示的也是正常的。

而Kibana在显示这些时间时,是有这么一个逻辑的:它把这些时间当作0时区(时间字符串,已经丢失时区信息),然后根据浏览器的时区信息来决定真正显示的时间。这个意思是,Kibana把从es中取到的时间当作0时区的时间(伦敦格林尼治天文台),也就是说存入的北京8点,会被它当作伦敦8点。然后它在显示时间时,还为我们人性化的加上误差,从而换算成所在地的时间(默认按照浏览器的设置):

这里写图片描述

可以看到,我们的浏览器默认设置是东八区(东八区比0时区早八个小时),所以Kibana就会在存入的时间基础上再加上8个小时,然后再进行显示,因此上面的两张图中,kibana显示的时间会比es多8个小时。

有没有办法修正呢?在kibana中设置时区即可,它的默认设置如下:

这里写图片描述

既然它默认按照0时区加上本地时区的误差来显示,那我们就更改我们的本地时区为0时区,也就是调整值为UTC/GMT等,如下所示:

这里写图片描述

这样,即使加上误差,也是加的0,不会对显示产生任何的影响。调整后再次查询,结果如下:

这里写图片描述

坚持原创技术分享,您的支持将鼓励我继续创作!