在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时间。有什么方法可以避免这种情况吗?
答案 0 :(得分:1)
这是预期的,因为ElasticSearch在显示日期时使用UTC,而Java Date对象使用系统的默认时区。
为避免这种情况,您可以设置日期解析器的时区
df.setTimeZone(TimeZone.getTimeZone("UTC"));
要确认,您可以查看org.elasticsearch.common.xcontent.XContentBuilder。