为什么FilterBuilders.rangeFilter方法更改范围查询中的日期?

时间:2014-11-18 12:07:58

标签: java elasticsearch date-range

Es 1.1中,我尝试使用范围过滤器作为日期字段,并使用以下映射:

"hiringDate": { "type": "date", "format": "dateOptionalTime" }

令人惊讶的是,由以下代码段构建的查询会将这两个限制的日期更改为前一天。

DateFormat df = new SimpleDateFormat("MM-dd-yyyy HH:mm:ss");
Date startDate = df.parse("11-16-2014 00:00:00");
Date endDate = df.parse("11-18-2014 23:59:59");

FilterBuilder rangeFilter = FilterBuilders
                      .rangeFilter("dateOfJoining").from(startDate).to(endDate);
System.out.println(rangeFilter);

这是输出:

{
 "range" : {
    "hiringDate" : {
                "from" : "2014-11-15T18:30:00.000Z",
                "to" : "2014-11-18T18:29:59.000Z",
                "include_lower" : true,
                "include_upper" : true
    }
  }
}

现在我的问题是它是预期的行为还是我做错了什么。似乎日期更改为GMT时间。有什么方法可以避免这种情况吗?

1 个答案:

答案 0 :(得分:1)

这是预期的,因为ElasticSearch在显示日期时使用UTC,而Java Date对象使用系统的默认时区。

为避免这种情况,您可以设置日期解析器的时区

  df.setTimeZone(TimeZone.getTimeZone("UTC"));

要确认,您可以查看org.elasticsearch.common.xcontent.XContentBuilder。