把想要的数据通过同步工具从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));
网友评论