在使用RestHighLevelClient查询时间戳timestamp时,timestamp时UTC格式,于中国时间有时差,所以需要使用timeZone来做转换。

Date begin = new Date();
Date end = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
//查询timestamp时间戳,使用timeZone自动转UTC时间
QueryBuilder queryBuilder = QueryBuilders.rangeQuery("@timestamp")
                        .gte(sdf.format(begin))
                        .lt(sdf.format(end)).format("yyyy-MM-dd HH:mm:ss.SSS").timeZone("+08:00");

        我们都知道elasticsiearch不是实时性的,数据在入elasticsearch之后经过refresh_interval时间后才能被检索到,这就导致我们需要等待数据刷新后才能被检索。当我们使用时间戳timestamp做查询条件的时候,我们就会想当然的认为是数据没有被刷新所以才查询不到。经过笔者测试发现,即使数据已经刷新完成,使用上面代码也一出现数据对不上问题。后来经过改造不适用timeZone问题解决。

Date begin = DateUtile.date8(new Date());
Date end = DateUtile.date8(new Date());
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
//查询timestamp时间戳
QueryBuilder queryBuilder = QueryBuilders.rangeQuery("@timestamp")
                        .gte(sdf.format(begin))
                        .lt(sdf.format(end)).format("yyyy-MM-dd HH:mm:ss.SSS");



public class DateUtil {
    public static final long TIMEZONE = 8*60*60*1000;
    //手动减少8小时
    public static Date date8(Date date){
        return new Date(date.getTime()-TIMEZONE);
    }
}

        如果对你有帮助,请点赞关注

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐