在ElasticSearch里面最常用的就是时间字段了,经常会在群里看到一些小伙伴提出有关时间的问题,为什么es查询的时间跟我实际看到的时间差8个小时呢。如果我们了解了ElasticSearch底层的时间存储方式就会比较容易的理解这个问题。

下面散仙先普及下时区的知识,想必大家也不陌生学过地理的同学都知道全球有24个时区每个时区的跨度是经度15度,

相较于两地时间表,可以显示世界各时区时间和地名的世界时区表(World Time),就显得精密与复杂多了,通常世界时区表的表盘上会标示着全球24个时区的城市名称,但究竟这24个时区是如何产生的?过去世界各地原本各自订定当地时间,但随着交通和电讯的发达,各地交流日益频繁,不同的地方时间,造成许多困扰,于是在西元1884年的国际会议上制定了全球性的标准时,明定以英国伦敦格林威治这个地方为零度经线的起点(亦称为本初子午线),并以地球由西向东每24小时自转一周360°,订定每隔经度15°,时差1小时。而每15°的经线则称为该时区的中央经线,将全球划分为24个时区,其中包含23个整时区及180°经线左右两侧的2个半时区 
就全球的时间来看,东经的时间比西经要早,也就是如果格林威治时间是中午12时,则中央经线15°E的时区为下午1时,中央经线30°E时区的时间为下午2时;反之,中央经线15°W的时区时间为上午11时,中央经线30°W时区的时间为上午10时。以台湾为例,台湾位于东经121°,换算后与格林威治就有8小时的时差。如果两人同时从格林威治的0°各往东、西方前进,当他们在经线180°时,就会相差24小时,所以经线180°被定为国际换日线,由西向东通过此线时日期要减去一日,反之,若由东向西则要增加一日。

几个时间名词:

  1. GMT:格林威治标准时间
  2. UTC:世界协调时间
  3. DST:夏日节约时间
  4. CST:中国标准时间

其中GMT时间可以近似认为和UTC时间是相等的,但从精度上来说UTC时间更精确。其误差值必须保持在0.9秒以内

CST= GMT + 8 =UTC + 8

从上面可以看出来中国的时间是等于UTC时间+8小时,es默认存储时间的格式是UTC时间,如果我们查询es然后获取时间日期默认的数据,会发现跟当前的时间差8个小时,这其实是正常的,因为es默认存储是用的UTC时间,所以我们需要做的就是读取long型时间戳,然后重新格式化成下面的时间戳,即可获得正确的时间 :

yyyy-MM-dd HH:mm:ss 

像差8个时区的事情,最容易见到的就是,我们使用logstash收集的日志,发送到es里面,然后通过head查询就能发现不一致,但是如果我们用kibana查询,就不会发现时区问题,为什么? 因为kibana已经处理时区问题了,所以在kibana的页面显示的时间是正确的。

此外在使用Java Client聚合查询日期的时候,需要注意时区问题,因为默认的es是按照UTC标准时区算的,所以不设置的聚合统计结果是不正确的。

在es的DateHistogramBuilder里面有几个比较重要的参数:

field:指定按那个字段聚合
interval:聚合的时间单位(年,季度,月,周,天,小时,分钟,秒)
format:日期格式
time_zone:时区指定
offset:时间偏移量  

注意,默认不设置时区参数,es是安装UTC的时间进行查询的,所以分组的结果可能与预期不一样,所以我们要指定时区为Asia/Shanghai代表北京的时区,这样才能获取正确的聚合结果

curl方式如下:

GET my_index/_search?size=0
{  "aggs": {  "by_day": {  "date_histogram": {  "field":     "ctime",  "interval":  "day",  "time_zone": "Asia/Shanghai"  }  }  }
}  

Java代码如下:

SearchRequestBuilder search = client.prepareSearch("search2017-02*").setTypes("log");
DateHistogramBuilder dateagg = AggregationBuilders.dateHistogram("dateagg");
dateagg.field("ctime");//聚合时间字段
dateagg.interval(DateHistogramInterval.DAY);//按天聚合第一天的0点到第二天的0点
dateagg.timeZone("Asia/Shanghai");//指定时区
dateagg.offset("+8h");//默认都是从0点开始计算一天的,通过这个offset,我们可以把第一天的6点到第二天的6点当做一天来聚合
search.addAggregation(dateagg);  Histogram hs= search.get().getAggregations().get("dateagg");
List<Histogram.Bucket> buckets =   (List<Histogram.Bucket>) hs.getBuckets();//获取结果
for(Histogram.Bucket bk:buckets){
//下面的转化,也是因为默认是UTC的时间,所以我们要获取时间戳,自己转化  System.out.println(new DateTime(Long.parseLong(bk.getKeyAsString()+"")).toString("yyyy-MM-dd HH:mm:ss") +"  "+bk.getDocCount());
}
client.close();  

上面的这个例子,基本涵盖了日期聚合核心功能,其中时区和偏移量时两个非常有用的而且需要特别注意的参数,不设置时区直接统计结果肯定是不准确的,offset偏移量这个参数,在某些时刻也是有用的,它可以自己定义一天的开始,比如设置从第一天的3点到第二天的3点为一天,默认都是从0点开始0点结束算做一天的,最后一点需要注意的是在输出打印时间的时候也要考虑转化因为默认也是UTC的时间,所以我们直接取出时间戳,自己格式化时间即可。

官网文档:

https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-datehistogram-aggregation.html

ElasticSearch里面关于日期的存储方式,解决差8个小时相关推荐

  1. mysql中时间的储存方式_数据库 中“日期/时间”存储方式

    Access中: Access 在内部以 双精度浮点数的形式存储"日期/时间"值.每一个此类数值均包含日期和时间两部分.小数点左边的整数部分表示日期.小数点右边的小数部分表示时间. ...

  2. es日期format_elasticsearch存储日期格式字段

    elasticsearch创建index之后,可以设置mapping,如果mapping中没有设置date的format,那么默认为两种格式: date_optional_time 此格式为ISO86 ...

  3. opengl中的Floatbuffer和IntBuffer与java中数据的存储方式不同的解决方法,编辑一个自己的BufferUtil工具类

    opengl中的Floatbuffer和IntBuffer与java中数据的存储方式不同的解决方法,编辑一个自己的BufferUtil工具类 参考文章: (1)opengl中的Floatbuffer和 ...

  4. 日期类型存储成字符串类型的格式问题

    问题 ConversionException: Could not convert '2017-8-28 0:00:00' to java.util.Date at com.vaadin.data.u ...

  5. 图片或者其他文件在数据库的存储方式详解

    关于图片或者文件在数据库的存储方式归纳 商品图片,用户上传的头像,其他方面的图片.目前业界存储图片有两种做法: 1.  把图片直接以二进制形式存储在数据库中 一般数据库提供一个二进制字段来存储二进制数 ...

  6. 数据存储-大数据的三种存储方式

    互联网时代各种存储框架层出不穷,眼花缭乱,比如传统的关系型数据库:Oracle.MySQL:新兴的NoSQL:HBase.Cassandra.Redis:全文检索框架:ES.Solr等.如何为自己的业 ...

  7. 22.25在计算机中如何储存,浮点数在计算机中存储方式

    C语言和C#语言中,对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数据占用32bit,double数据占用64bit,我们在声明一个变量float f= ...

  8. 《iOS取证实战:调查、分析与移动安全》一3.4 数据存储方式

    3.4 数据存储方式 iPhone上的数据以很多方式进行存储.下面的小节涵盖了每一个数据存储的形式以供审查者了解潜在的证据如何定位或恢复. 内部存储: SQLite 数据库文件: 属性列表: 网络: ...

  9. JavaPairRDD方法中几种存储方式的坑

    2019独角兽企业重金招聘Python工程师标准>>> 1,ERROR Utils: Aborting task   java.io.IOException: key out of ...

最新文章

  1. MySQL第九章索引_MySQL高级(索引优化+慢查询定位)
  2. 7系列mrcc xilinx_XILINX 7系列FPGA_时钟篇
  3. java剑姬_ListView和Adapter(文字列表)
  4. LeetCode 2070. 每一个查询的最大美丽值(离线查询+排序+优先队列)
  5. angular moment 倒计时_倒计时3天丨探寻日本室内设计之道
  6. 【codevs1001】舒适的路线,心累的冰茶几
  7. Oracle 坏块 总结
  8. centos网络隔一段时间就断_潮汕青年说 | 瞎吃小哥:隔着屏幕也要把你看馋的顶配版吃货...
  9. Gse v0.40.0 发布,Go 高性能分词,增加更多常用 API
  10. 计算机二级C语言题库
  11. 命令行传感器和模板的使用之在 Home Assistant 中监控树莓派的 CPU 温度,内存等信息
  12. tableau入门视频笔记(一)
  13. Android学习路线指南-------任玉刚
  14. 【02】Java进阶:09-冒泡排序、选择排序、二分查找、异常、异常的产生和处理、自定义异常、多线程
  15. python多条件求和_python – Numpy:条件求和
  16. python box2d模拟平抛运动_box2d 粗略的模拟水浮力
  17. 联诚发召开宝安区卓越绩效管理标准实施项目启动大会
  18. Elasticsearch项目实战,商品搜索功能设计与实现!
  19. Protractor AngularJS测试框架教程
  20. dz diy html用户信息,Discuz教程:个人资料设置只显示用户名的解决方法

热门文章

  1. macbook禁用键盘_一行命令禁用 MacBook 内置键盘
  2. python求同构数_用c语言求1到1000的同构数_后端开发
  3. python for循环n次_Python入门10 —— for循环
  4. 计算机在材料科学中的应用上机二,计算机在材料科学中的应用-上机实验二.doc...
  5. 查看db2数据库名linux,【名说】DB2数据库备份与恢复(linux环境)
  6. php mvc 逻辑层在哪,mvc的业务逻辑应该放哪里?
  7. MySQL数据库是非关系_MySQL(数据库)基础知识、关系型数据库yu非关系型数据库、连接认证...
  8. linux由众多微内核组成,什么是linux
  9. npm 全局安装vuecli报错_cnn explainer本地使用--被npm坑惨
  10. centos7时间同步_centos 8.x系统配置chrony时间同步服务