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

在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  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/553702.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

谷歌浏览器如何收藏网站 谷歌浏览器收藏网站的方法步骤

谷歌浏览器如何收藏网站?当我们在使用谷歌浏览器想要收藏网站应该怎么办呢?今天小编就给大家带来谷歌浏览器收藏网站的具体方法步骤&#xff0c;让我们一起来看看吧。 方法/步骤 1、我们需要先在谷歌浏览器中随便打开一个网站; 2、然后我们在谷歌浏览器网址输入栏的最右边…

syslog发送日志而docker容器接收不到的问题

syslog支持"udp", "tcp", "unix_syslog", "unix_socket"协议 ,所以要判断其到底使用了什么端口类型 logstash:image: zzjz/logstash:6.2.2container_name: logstashrestart: alwaysports:- 10010:10010- 10011:10011- 10012:10012- 1…

IE浏览器网页无法缩放怎么办 解决IE浏览器网页无法缩放的方法

IE浏览器网页无法缩放怎么办?我们在使用IE浏览器浏览网页的时候&#xff0c;想要缩放网页&#xff0c;却发现无法缩放。该怎么解决这个问题?下面就是解决IE浏览器网页无法缩放的方法&#xff0c;一起来看看吧! 今天使用了一下IE浏览器&#xff0c;发现无法对缩放比例进行调整…

ElasticSearch的update_by_query使用

ElasticSearch的update_by_query语句可以很方便地为原有es表修改字段和新增字段,如下面的例子所示: 1.将资产表中area为空的字段赋值为无 POST soc-system/_update_by_query {"script": {"source": "ctx._source[area]无" },"query"…

猎豹浏览器怎么设置允许弹出窗口 允许弹窗设置方法详解

频频出现的广告弹窗&#xff0c;让不少人选择打开所用浏览器的弹窗拦截功能。不过&#xff0c;此举也带来了一点小麻烦&#xff0c;那就是容易误伤“友军”&#xff0c;一些必要的弹窗也会被强制拦截!那么&#xff0c;该怎么解决这一问题呢?下面小编就以“猎豹浏览器”为例&am…

JDK线程池CompletionService的使用

最近使用多线程优化了一个非常耗时的ping任务&#xff0c;下面的是未优化的源代码&#xff0c;大致就是遍历es取出的list&#xff0c;然后循环判断是否能ping通&#xff1a; SearchResponse searchResponse client.search(searchRequest); Iterator it searchResponse.getHi…

win7系统应用程序安装不了的解决教程

软件是计算机数据和指令的集合&#xff0c;一般有系统软件和应用软件。系统是应用软件安装的平台&#xff0c;但是由于一些设置或者故障就会出现安装不了软件的情况&#xff0c;win7系统无法安装应用程序怎么解决?就此问题&#xff0c;下面就来跟大家聊聊win7系统应用程序安装…

解决mediawiki上传文件文件名是中文上传失败

公司内部的wiki是用的mediawiki&#xff0c;其它都还好就是上传文件时文件名中有中文就不能上传&#xff0c;这次下决心要修复这个问题&#xff0c;一开始我还以为是哪里需要配置一下&#xff0c;然后搜了半天发现这是一个官方的bug&#xff1a; 好吧&#xff0c;是官方bug也好…

win7系统字体模糊发虚不清晰的解决方法

如果我们使用的电脑操作系统是win7的话&#xff0c;当我们操作的时候发现系统的字体显示变得模糊发虚不清晰的情况不知道怎么解决的话&#xff0c;小编觉得我们可以先排查一下是自己电脑显示器的原因还是系统设置的问题。一般来说都是需要在电脑设置一下即可。详细解决步骤就来…

Elasticsearch Curator使用

介绍 Elasticsearch Curator通过以下方式帮助您策划或管理您的Elasticsearch索引和快照&#xff1a; 从集群中获取索引&#xff08;或快照&#xff09;的完整列表&#xff0c;作为可操作列表迭代用户定义的过滤器列表&#xff0c;根据需要逐步从此可操作列表中删除索引&#…

win7系统怎么更改语言及字体

win7系统中的字体和语言等&#xff0c;都是我们在使用电脑时&#xff0c;非常重要的东西&#xff0c;有部分用户们想要更改系统的默认的字体或者语言等&#xff0c;不知win7系统怎么更改语言及字体的话&#xff0c;就快来看看win7系统语言及字体等问题解决攻略吧~ win7系统怎么…

DHCP租用信息导出方案

方法一 使用“netsh dhcp server export”比“netsh dhcp server dump”的优点是export命令还将从DHCP服务器提取并存储活动租约信息(active lease information);这样&#xff0c;当我们恢复时&#xff0c;活动租约也会从该时间点恢复。 &#xff08;相反&#xff0c;dump命令…

windows7系统内存占用过高的解决方法

电脑的内存空间取决了电脑的运行流畅度&#xff0c;时间一久内存就会爆满导致占用过高这样就会使电脑变得延迟&#xff0c;那么windows7系统内存占用过高怎么办呢?下面就一起来看看windows7系统内存占用过高的解决方法吧。 windows7系统内存占用过高的解决方法&#xff1a; …

Metricbeat添加ip address信息

Metricbeat默认输出信息里没有ip地址&#xff0c;6.3版本之后可以通过add_host_metadata 来开启附带ip信息&#xff08;没测试过&#xff09; 原本我是通过修改modules.d/system.yml文件&#xff0c;在每项后面加自定义fields.ip字段来添加ip信息&#xff0c;类似下面这样&…

UC浏览器怎么清除缓存

UC浏览器怎么清除缓存 当我们的浏览器用久了&#xff0c;垃圾就多了&#xff0c;快点来让你的浏览器减减肥吧。以UC浏览器为例小编教大家怎么让你的浏览器减肥&#xff0c;甩掉不必要的垃圾。分享一篇UC浏览器清除缓存方法&#xff0c;希望能帮到大家 1、双击打开你的uc浏览器…

前端获取不了rest请求自定义headers的问题

前端response中的自定义header信息默认同一域中可见 在crossdomain跨域情况下需要在服务器端增加Access-Control-Expose-Headers的支持 例如在springboot中需要使用addExposedHeader添加指定返回头&#xff1a; Configuration public class CORSConfiguration implements WebM…

QQ浏览器如何添加并进入书签地址?QQ浏览器添加并进入书签地址的方法

打开手机“QQ浏览器”应用进入。 QQ浏览器如何添加并进入书签地址&#xff1f;QQ浏览器添加并进入书签地址的方法[多图] 进入主界面&#xff0c;选择或者搜索一个网页进入。 QQ浏览器如何添加并进入书签地址&#xff1f;QQ浏览器添加并进入书签地址的方法[多图] 进入相应网…

同时运行多个logstash而kibana监控界面只统计到一个的问题

问题 同时在36和39两台主机上启动了两个logstash&#xff0c;两台通过日志查看都正常运行&#xff0c;但是在Kibana的监控界面查看节点&#xff0c;发现统计结果只有一台 分析 logstash的monitor和management是统一交由xpack管理的&#xff0c;其中logstash的监控数据也会存…

浏览器的安全设置在哪里?要如何设置

所有的浏览器都有安全设置&#xff0c;安全的强度都是默认的&#xff0c;但是用户在浏览一些网站的时候就会出现无法打开的情况&#xff0c;出现这种情况一般都是因为浏览器的安全系数太高了&#xff0c;所有会自动阻拦用户访问网站的权限&#xff0c;那么浏览器的安全设置要如…

Vue cli3使用jQuery控件

背景介绍 由于历史遗留问题需要使用之前基于jQuery的代码&#xff0c;其中还用到了一个基于jQuery的多选控件&#xff0c;环境是vue cli3 导入并配置jQuery 首先通过npm导入jQuery npm install –save jquery修改package.json同级的vue.config.js文件(如果没有&#xff0c;…