Elasticsearch Date类型数据默认格式:将数据写入es的时间后再读取出来缺少8小时原因
一、问题描述
把想要的数据通过同步工具从MySQL中写入es中存储,然后从搜索后台管理系统读取数据列表,发现时间显示比数据库中显示的时间要提前8小时。
二、问题分析
首先在索引里面查看了时间数据的存储格式为世界时间,默认是0时区,但是我们一般用的是北京时间东八区,因此间隔了八小时。
直接转过来的时间是:
但实际上数据库里面存储的时间是:
我们需要最终显示的是时间是和存在数据库中的北京时间一致。
搜索的数据来源于存储在elasticsearch里面的数据,因此可以从数据源(存储在es里面的数据)、后台处理、前端处理三种方法处理0时区的数据。
三、解决方案
1、最好的办法是改变数据源,也就是在使用同步工具的时候,写入es中的时间数据是通用时间yyyy-MM-dd HH:mm:ss 格式的数据。
我这边使用的是公司产品adapter同步数据,其中有一个写入数据到elasticsearch中的插件。
如果不对数据做任何处理,写入elastic中的数据会自动转换成GMT,默认0时区,因此现在要做的事情就是修改同步工具elasticsearch插件的源代码。
在获取MySQL中的数据后根据数据类型对Date类型数据进行处理(部分代码):
if(data instanceof Date) {
SimpleDateFormat fm= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
data= fm.format(data);
}
record.put(targetField.getFieldName(), data);
注意事项:es支持的日期格式
https://www.elastic.co/guide/en/elasticsearch/reference/2.3/mapping-date-format.html
其中并未含有yyyy-MM-dd HH:mm:ss 格式,因此需要格式化时间。
在es中,date类型的默认格式为:"strict_date_optional_time||epoch_millis"
在写入es的时候,格式化了时间,因此在mapping中的时间格式要增加yyyy-MM-dd HH:mm:ss的格式。
2、在代码中获取到es中的数据后转格式。
直接转为通用格式yyyy-MM-dd HH:mm:ss的话,时间是少8小时的,因此解决办法为,将时区默认为0时区。(不推荐)
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
3、前端处理,方法同上,或者转换时间时加上8小时,但是这个会有一个问题,遇到零点、月底、年底、闰年时,需要对应的进一位,处理起来比较麻烦,因此不推荐。
四、总结
处理问题时一般最好从源头解决问题。
处理方案参考文章:Elasticsearch Date类型,时间存储相关说明。
阅读更多- net控件中数据导到Excel的格式 首先,我们了解一下excel从web页面上导出的原理。当我们把这些数据发送到客户端时,我们想让客户端程序(浏览器)以excel的格式读取它,所以把mime类型设为:application/vnd.ms-excel,当excel读取文件时会以每个cell的格式呈现数据,如果cell没有规定的格式,则excel会以默认的格式去呈现该cell的数据。这样就给我们提供了自定义数据格式的空间,当然我们必须使用excel支持的格式。下面就列出常用的一些格式: 1) 文本
- Java DATE类型日期转换为指定格式――取出时间与系统时间差8小时
- 数据库中关于datetime、date 、time数据类型比较,及插入日期时间数据格式
- SpringBoot返回date日期格式化,解决返回为TIMESTAMP时间戳格式或8小时时间差
- Oracle 默认时间格式 & Date格式转换
- ACCESS通过一个连接写入的数据,另一个连接却读取不出来
- Elasticsearch之重要核心概念(cluster(集群)、shards(分配)、replicas(索引副本)、recovery(据恢复或叫数据重新分布)、gateway(es索引的持久化存储方式)、discovery.zen(es的自动发现节点机制机制)、Transport(内部节点或集群与客户端的交互方式)、settings(修改索引库默认配置)和mappings)
- 数据库存储的数据为 unicode格式,在.NET 读取出来并转换为繁体字?
- JS将字符串类型的时间格式转换为date格式
- java部分基础类型及时间格式的数据格式相互转换方法整理
- 如何获取sql数据中时间的月份、年份(类型date)
- NSString的各种用法总结(创建、截取、判断比较、转化数据类型、拼接、替换、添加、追加、读取、写入、删去、...
- C#读取Oracle中DATE类型的值,数据表中为空时,怎么去读?
- Java对Oracle中Clob类型数据的读取和写入
- Elasticsearch Date类型,时间存储相关说明
- Oracle中date数据类型插入格式
- Java向MySQL数据库插入时间类型Date数据时需要注意的问题(二)
- MySQL datetime数据类型设置当前时间为默认值
- SQL中使用CONVERT函数对时间数据类型进行格式转化
- 关于数据库的中的Date类型的数据,在datagrid中显示为字符串格式(例如显示效果2017-10-1)