ES对时间类型数据的处理

2019-03-11  本文已影响0人  蜡笔广志

把想要的数据通过同步工具从MySQL中写入ES中存储,然后从搜索后台管理系统读取数据列表,发现时间显示比数据库中显示的时间要提前8小时。

造成这个问题的原因是ES存储格式为世界时间,默认是0时区,但是我们一般用的是北京时间东八区,因此间隔了八小时。

解决这个方法的思路有2个:

1把date转换成long型,避开时区概念。缺点是不够直观,显示的时候还要进行一次时间转码。

2:在检索或者插入的时候补齐这8小时的时差,方法如下

// 获取es用时间

public static String getDateForEs(Date date) {

// 开始日期

Calendar cal = Calendar.getInstance();

cal.setTime(date);

cal.add(Calendar.HOUR, - 8);

date = cal.getTime();

String time = getISO8601Timestamp(date);

return time;

}

public static String getISO8601Timestamp(Date date){

TimeZone tz = TimeZone.getTimeZone("Asia/Shanghai");

DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");

df.setTimeZone(tz);

String nowAsISO = df.format(date);

return nowAsISO;

}

方法调用

startDate = DateUtil.getStartSecondsDate(DateUtil.stringToYMD(strCreateTime));

endDate = DateUtil.getVailDate(DateUtil.stringToYMD(strCreateTime));

start = DateUtil.getDateForEs(startDate);

end = DateUtil.getDateForEs(endDate);

// 实际检索

mainBuilder.must(QueryBuilders.rangeQuery("createtime").from(start).to(end));

上一篇下一篇

猜你喜欢

热点阅读