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

elasticsearch时间柱状图聚合java实现 需求:统计每天有多少条数据,以及某字段的平均值。 1. 使用DateHistogramAggregationBuilder按天统计,再嵌入aggs取平均值。 如果要对结果进行排序,在 AggregationBuilders 加上 .order(Histogram.Order.COUNT_DESC) AvgAggregationBuilder avgAggregationBuild... 阅读详情
AI摘要

本文讲解ElasticSearch中时间字段的处理方式,包括时区差异、时间格式化、日期聚合查询等关键操作,并提供Java代码示例。

在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  
mongo-日期类型/日期查询/时间查询/UTC + 8h = 北京时间new Date/ISODate mongo-日期类型(2) 时间格式2020-01-13T16:00:00.000Z中的T和Z T表示分隔符,Z表示的是UTC。 UTC:世界标准时间,在标准时间上加上8小时,即东八区时间,也就是北京时间。 举例 北京时间:2020-01-14 00:00:00对应的国际标准时间格式为:2020-01-13T16:00:00.000Z 1、当通过mongo shell来插入日期类型数据时,使用new Date()和使用Date()是不一样的: 2、我们看:使用new Date(),插入的是. 阅读详情

相关推荐

Diebold-Mariano检验

给定两个预测的预测结果,我们希望比较他们的预测结果,以用于预测模型精度的比较。 Diebold-Mariano检验本质是一个t检验,用于检验替代预测的两个损失序列的平均值是否相等。即,它是一系列损失差的零均值的t检验。在存在自相关的情况下,它使用损失差分时间序列标准差的自相关一致性估计。 注意,在使用DM检验式时,假设损失序列是平稳的。 另外,DM检验在小样本数据时往往会拒绝零假设。对于小样本数据,推荐Harvey, Leybourne and Newbold (HLN)检验【1】; 参考文献 【1】htt

weixin_43948357的博客 6565

ElasticSearch里面关于日期的存储方式

在ElasticSearch里面最常用的就是时间字段了,经常会在群里看到一些小伙伴提出有关时间的问题,为什么es查询的时间跟我实际看到的时间差8个小时呢。如果我们了解了ElasticSearch底层的时间存储方式就会比较容易的理解这个问题。 下面散仙先普及下时区的知识,想必大家也不陌生学过地理的同学都知道全球有24个时区每个时区的跨度是经度15度, 相较于两地时间表,可以显示世界各时区

三劫散仙 1万+

Arduino-Pico:用Arduino生态开发树莓派RP2040双核与PIO实战

在嵌入式开发领域,微控制器编程是连接硬件与软件的核心技能。其原理在于通过编写代码直接控制处理器与外设,实现特定功能。掌握这项技术能极大提升开发效率,降低硬件操作门槛,广泛应用于物联网、智能硬件和自动化控制等场景。本文聚焦于如何利用Arduino这一广受欢迎的生态,来开发树莓派RP2040微控制器。RP2040以其双核Cortex-M0+架构和独特的可编程IO(PIO)硬件而著称,性能强大。通过第三方Arduino核心(arduino-pico),开发者可以沿用熟悉的Arduino语法和库,快速调用双核并行处

weixin_26905423的博客 381

ES存储Date时间问题

时间未设置时区,相差8小时 存储时间格式化yyyy-MM-dd HH:mm:ss 自定义格式 写法总结 写法一:默认 写法二:@JsonFormat 有的文章时间太久不能用,有的不给写法,差评!

瑶山的博客 1万+

信号转换为图像 时域频域分析

一维信号如何转化为图像?深度学习如何学习 1.当然,直接1d卷积也是可以的。 2. 以信号强度的数值作为纵坐标,以时间为横坐标绘制信号点就可以了。 周霖那个即是 要看看代码是如何做的, 即使是单导联 5000个点,怎么变成50005000的分辨率的 3. 直接把多通道的一维信号合并成二维图像,然后直接按图像卷积的方法去做~~ 2225000这样一个图 ~可以看看语音处理的相关Net,其中比较...

王不留行嘿呦嘿 2万+

LVDS高速ADC接口, xilinx fpga实现

FPGA实现lvds高速ADC数据接口,窗口对齐算法,Verilog源码

kuangxin的博客 6万+

为什么ES里的日期查询总是差8个小时

1、前言 我们在做 Java 开发过程中其实很少关心时区的问题,因为这个一般都使用系统默认的东八区了,所以在存储时间和查询时间时感觉不到时区的存在,以及可能会发生的问题。但是有 ES(Elasticsearch)开发经验的朋友可能或多或少都遇到或者处理过 ES 中的日期类型的时区问题,当遇到此类问题时可能也会很快解决,因为网上教程很多,如何设置、如何指定日期格式,等等,但是并不见得会深度研究。 当然,对于一个一直对时区、什么GMT+8、UTC总是一知半解的我来说,总是感觉...

行者 4981

用nTopology五分钟生成三维Voronoi泡沫:节点式建模从原理到实操

多孔结构在增材制造与轻量化设计中应用广泛,其中Voronoi泡沫因其优异的缓冲吸能和比刚度表现备受关注。传统CAD建模需处理复杂布尔运算和网格修复,而隐式建模通过数学场描述几何体,将空间距离与密度分布转化为可视化节点,大幅降低操作门槛。nTopology基于场驱动与参数化逻辑,无需编写命令,即可实时调节胞元尺寸、壁厚及随机种子,快速生成可打印的泡沫实体。这种工作流适用于缓冲垫、医疗植入体、航空支架等场景,也为梯度密度结构与力学仿真验证提供了高效路径。本文围绕三维Voronoi泡沫的生成原理与节点操作流程,详

weixin_26767391的博客 151

spring-data elasticseach存储日期(Date, Time, Timestamp)型的方法

测试一下,还是出错,说是什么日期格式问题,我又想,我java里也是日期型的,ES里也是日期型的,那么它不应该是全部自动搞定吗,为什么还要我注解这么多呢?网上搜了一圈,各种解决方法都不管用。我想,既然这个字段是日期型的,我就用日期型存储在ES中,既少占空间,又能提高搜索效率,何乐而不为之?今天碰到一个问题,就是我们要搜索一个日期字段,这个字段在elastic里的存储类型为text,导致搜索出现错误。原来真是应验了一句古话:大道至简!

weixin_45357522的博客 937

RK3588设备树调试实战:解决NPU不加载、USB3.0识别异常与DP显示问题

本文深入探讨了RK3588设备树调试中的三大典型问题:NPU不加载、USB3.0识别异常与DP显示问题。通过详细的问题定位步骤、关键设备树修改和调试技巧,帮助开发者快速解决硬件适配中的挑战,提升RK3588平台的开发效率。

weixin_30576827的博客 477

【AI 赋能:Python 人工智能应用实战】16. BERT微调实战:中文新闻分类全流程(附模型蒸馏+ONNX部署完整代码)

中文新闻分类是NLP领域的经典实用任务,BERT模型凭借双向上下文建模能力,能有效解决中文歧义与长文本依赖问题,但存在推理速度慢、资源占用高的痛点。本文以THUCNews中文新闻数据集为核心,提供从数据预处理、BERT微调、模型蒸馏到生产部署的全流程实操指南。首先详解THUCNews的多编码读取与清洗(解决gbk/utf-8兼容问题);然后实现BERT微调,加入早停机制与混淆矩阵可视化,验证准确率达93.8%;接着用DistilBERT完成模型蒸馏,在仅损失0.6%准确率的前提下,将推理速度提升2.7倍。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1098

elasticsearch 聚合之 date_histogram 聚合

此处来简单学习一下 `elasticsearch` 的 `date_histogram`直方图聚合。它和普通的直方图`histogram`聚合差不多,但是`date_histogram`只可于 `日期或日期范围` 类型的值一起使用。

huan的学习记录 4157

【Python爬虫(1)】专栏开篇:夯实Python基础

要想熟练掌握 Python 爬虫技术,扎实的 Python 基础是必不可少的。这就好比建造高楼大厦,Python 基础就是那稳固的基石。只有打好了这个基础,我们才能在爬虫的学习道路上稳步前行,理解并运用各种爬虫技术和框架。

邓邓子的博客 2026

(8)Elasticsearch-mapping详解

1、Mapping简介 mapping 是用来定义文档及其字段的存储方式、索引方式的手段,例如利用mapping来定义以下内容: 哪些字段需要被定义为全文检索类型 哪些字段包含number、date类型等 格式化时间格式 自定义规则,用于控制动态添加字段的映射 例子: PUT /idx_item/ { "settings": { "index": { "number_of_shards" : "2", "number_of_replicas" : .

allensandy的博客 1717

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Elastic search的日期问题

对于我们的直观感受和搜索而言呢,时间戳对于搜索倒是便利些,但是不够直观,只是一个数字而已。es的默认日期是采用的零时区,比我们少八个小时,无论是对于搜索还是直观感受,都有些不便。日期格式化为字符串后存储,比较直观,但是搜索起来就坑爹了,如果不觉得麻烦的人还望指教。无论我们以何种日期存放,elastic search的底层存放的还是时间戳,时间戳存储起来还是比较方便的。进入职场后,基本就一直在使用jdk 1.8,因此想想java 8有没有什么更好的解决方案呢?欢迎有更好解决方案的大牛前来拍砖!

m0_67403076的博客 1507

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

MySQL-日期数据类型

YEAR 类型通常用来表示年 DATE 类型通常用来表示年、月、日 TIME 类型通常用来表示时、分、秒 DATETIME 类型通常用来表示年、月、日、时、分、秒 TIMESTAMP 类型通常用来表示带时区的年、月、日、时、分、秒 类型 名称 字节 日期格式 最小值 最大值 YEAR 年 1 YYYY或YY 1901 2155 TIME 时间 3 HH:MM:SS -838:59:59 838:59:5

zl979899的博客 1924

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Phoenix日期时间问题

Phoenix中跟时间相关的类型有TIMESTAMP,DATE和TIME,这些类型对于时区的处理逻辑是相同的,所以这里就以TIMESTAMP类型为例来说明Phoenix关于时区的处理方式。首先,我们先来看下Phoenix文档中对于TIMESTAMP类型的描述: The timestamp data type. The format is yyyy-MM-dd hh:mm:ss[.nnnnnnnnn]. Mapped to java.sql.Timestamp with an internal rep...

lzzyok的专栏 2914

南大通用GBase 8s数据库兼容oracle时间及日期类型简介

但要说明的是,Oracle中的date对应GBase 8s中的datetime year to second,GBase 8s中的date默认仅支持年月日,不支持时分秒,而Oracle中timestamp§则对应GBase 8s中的datetime year to fraction(min(5,p)),最多保留小数点后5位。DATE是最常用的数据类型,日期数据类型存储日期和时间信息。为每个日期值,Oracle 存储以下信息: 世纪、 年、 月、 日期、 小时、 分钟和秒。用来存储单位为年和月的时间间隔。

weixin_47390342的博客 379

Oracle 数据类型及存储方式 日期时间类型

[url]http://www.net527.cn/shujukuguanli/Oracle/2010/0623/11647.html [/url] 第三部分 日期时间类型 3.1 DATE Date类型Oralce用于表示日期和时间的数据类型。固定占用7个字节。 包括七个属性: 世纪 世纪中的年份 月份 月份中的哪一天 小时 分 秒 SQL create table test_dat...

转些好文章,促进分享。 587

Es直方图聚合--date_histogram

这允许以支持的单位的任意倍数指定固定间隔。但是,这意味着固定间隔不能表示其他单位,例如月,因为一个月的持续时间不是固定的数量。一分钟是指定时区中第一分钟的00秒和下一分钟的00秒之间的时间间隔,用于补偿任何介于其间的闰秒,因此整点后的分钟数和秒数在开始和结束时是相同的。所有天都在尽可能早的时间开始,通常是00:00:00(午夜)。它的单位只能是单数,不可是复数,比如。的关系,在有的国家,在某些时区下,一天就不一定是24个小时。单位,无论它们落在日历的哪个位置,都不会偏离。可用的单位为:分钟 (

rbx508780的博客 2986

使用 SAS 日期和时间

SAS 将日期和时间存储为一个唯一数字,这样就可以象使用其他数值变量一样在程序中使用它们: SAS 日期值代表介于 1960 年 1 月 1 日和指定日期之间的天数。SAS 可以对公元 1582 年到公元 19,900 之间的日期进行计算。1960 年 1 月 1 日之前的日期为负数;在此之后的日期为正数。 SAS 时间值代表自当日午夜 12 时算起的秒数,SAS 时间值介于 0 和

cyxlxp8411的专栏 1万+
上一篇: IP地址开启https
下一篇: syslog发送日志而docker容器接收不到的问题
方块糖
博客等级 码龄15年 44粉丝 63原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值