说明:
在Java开发中常见使用 yyyy-MM-dd HH:mm:ss 来格式化时间戳
例如:
@ApiModelProperty("订单开始日期")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date date;
但是这种对象在Es存储时会被存储为字符串,从而无法在Es进行时间戳比较等过滤统计等。
方案一
网上采用的方案多是Java采用LocalDate或者LocalDateTime 格式声明为yyyy-MM-dd'T'HH:mm:ss:SSS'Z',然后再修改对应Es索引的对应字段的mapping
此方案因为项目中存量对象带时间戳的过多,且修改mapping的部署成本相对较大。特别实在带有基类create_time和update_time的时候,不可能每个索引都去修改,
所以直接弃用。采用了第二种取巧方案。
方案二
对每个时间字段加一个long类型的数据字段。如下图代码
import com.alibaba.fastjson.annotation.JSONField;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.google.common.collect.Lists;
import java.util.Date;
import java.util.List;
import javax.persistence.MappedSuperclass;
import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.domain.Sort;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldTyp e;
import org.springframework.format.annotation.DateTimeFormat;
@Data
@MappedSuperclass
public class BaseSearchPo {
@Id private Long id;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date ctdTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updTime;
@Field(type = FieldType.Long)
private Long ctdTimeStamp;
@Field(type = FieldType.Long)
private Long updTimeStamp;
public static Sort BASE_SORT;
static {
List<Sort.Order> sortOrders =
Lists.newArrayList(
new Sort.Order(Sort.Direction.DESC, "updTimeStamp"),
new Sort.Order(Sort.Direction.DESC, "ctdTimeStamp"));
BASE_SORT = Sort.by(sortOrders);
}
public void setCtdTime(Date ctdTime) {
this.ctdTime = ctdTime;
if (this.ctdTime != null) {
this.ctdTimeStamp = this.ctdTime.getTime();
}
}
public void setUpdTime(Date updTime) {
this.updTime = updTime;
if (this.updTime != null) {
this.updTimeStamp = this.updTime.getTime();
}
}
}
之后在数据比较时筛选时,通过long类型的时间戳字段去比较计算。