夏时制,夏时令(Daylight Saving Time:DST),又称“日光节约时制”和“夏令时间”,是一种为节约能源而人为规定地方时间的制度,在这一制度实行期间所采用的统一时间称为“夏令时间”。一般在天亮早的夏季人为将时间调快一小时,可以使人早起早睡,减少照明量,以充分利用光照资源,从而节约照明用电。各个采纳夏时制的国家具体规定不同。目前全世界有近110个国家每年要实行夏令时。
由于存在人为的修改夏令时的开始日期,一旦发生修改,如果tzdata没有及时更新,日期就会在夏令时切换时出现不准确的情况。全球的时区数据都是由Time Zone Database来维护,一旦发生认为修改,需要及时跟新时区数据。今年巴西把夏令时推迟了,以下是修改Elasticsearch 时区数据的记录。
Elasticsearch 是java程序,博主就把JDK的tzdata给更新了。本以为一切都搞定了,没想到Elasticsearch却按照旧的时区进入了夏令时,导致查询到的数据出现了偏差。- -!出现问题后开始排查,先是查了JDK的时区有没有生效,又查了JVM的时区数据是否加载成功,总之就是各种查,得到的只有一个结果,JDK的时区是准确的!
查完JDK后,开始觉得不对劲,可能是ES本身的问题,开始翻ES的代码。。。看到ES的依赖包时,发现一个关于时间的依赖包,joda-time!!!查了下这个依赖包,发现这个依赖包居然自己维护一套tzdata,突然有种掉入坑了的感觉。查了joda-time的官网,发现Elasticsearch依赖的这个版本的时区数据是很老的版本,根本已经不准了。不过还好joda-time提供了方法来更新tzdata。
一、升级依赖包。二、自己下载tzdata重新打包。
博主升级了joda-time到2.10,重启es后,数据查询恢复正常
总结:Elasticsearch 是根据joda-time来获取时间相关的数据的,所以升级tzdata时,要从joda-time入手。
转载请注明出处: http://www.julyme.com/20181024/108.html
打赏一个呗~~(微信)
Julyme
感觉还行吧。
Julyme的IT技术分享