直接用标准的日期查询是可以指定时区的, ES 会自动帮你做转换, 官网说 ES 存储的日期格式底层是按照时间戳格式存储的, 没有时区信息
{
"range": {
"c_birthday": {
"time_zone": "+08:00",
"gte": "2019-08-27"
}
}
}
要按天或者按月查询的时候, 如果按天查询, 脚本里面不指定时区的话, 就会产生偏移, 比如我在东八区查询, 就有8个小时的偏移误差, 怎么解决这个问题?
两个方案
- 查询的时间减8小时
- 查询条件带上时区
下面是方案2的查询示例
"query": {
"bool": {
"must": [
{
"script": {
"script": {
"source": "if (!doc.containsKey('c_birthday') || doc['c_birthday'].size() == 0) {return false;} else {def birthday = LocalDateTime.ofInstant(Instant.ofEpochMilli(doc['c_birthday'].value.toInstant().toEpochMilli()), ZoneId.of('UTC+8')); def min_cond = birthday.getMonthValue() >= params.min_month; if (params.min_day != 0)