java es date 时间处理

最近在存储数据到es中,总会有各种各样的问题,找遍了全网,也没有发现一个总结的比较好的,特此个人总结一下。

1.在使用log(elk,logstash)存储数据到elk时,因为用的是带时区的方法,也就是:

yyyy-MM-dd'T'HH:mm:ss:SSS'Z'

这种格式,默认是UTC时间,东八区需要+8小时,所以在打日志的时候存储其他时间时:

时间不要以这种格式:

yyyy-MM-dd HH:mm:ss

因为存不了空格,精度会丢失,也不要这样:

yyyy-MM-dd-HH:mm:ss

因为elk在解析时会默认把这种格式时间转换,精度还是有问题,所以要不然直接这样把:

yyyy-MM-ddHH:mm:ss
或
yyyy年MM月dd日HH:mm:ss:SSS

当然你也可以存这种:

DateFormater.DATE_STYLE_UTC = "yyyy-MM-dd'T'HH:mm:ss:SSS'Z'";

       logMessage.put("creTime", DateFormater.DateToString(new Date(),DateFormater.DATE_STYLE_UTC));

这样子存的时间是带时区的,不过!!!!你得-8小时,不然和es自带的UTC时间不统一了,会有大麻烦的!

所以别让他搞事就对了,不过这样我们在查询时会有很多麻烦,最后权衡还是决定存时间戳:

new Date().getTime()

2.在Document中创建时间类型字段时,有几种写法,主要是:

// 下发时间
	@Field(type = FieldType.Date, format=DateFormat.custom,pattern ="yyyy-MM-dd HH:mm:ss:SSS")
	@JsonFormat(shape = JsonFormat.Shape.STRING, pattern ="yyyy-MM-dd HH:mm:ss:SSS",timezone="GMT+8")
    private Date creTime;

(1)时区如果不+8,就会造成时间少八小时

(2)没有jsonFormat,存储在es的是时间是long类型:

(3)格式化完成后,时间格式:

(4)多次尝试想要格式化成这样yyyy-MM-dd'T'HH:mm:ss:SSS'Z'    带时区的数据,可是每次这样过后得会造成数据格式为text了,目前没有很好的解决方案,参考:https://stackoverrun.com/cn/q/8825116  可是完全没用啊。。。

3.在kibana中,默认带时区的时间会根据浏览器所在的地区自动计算正确时间:

 

最新更新:

存的时间目前还是用时间戳的方式,但是logstash存储的时间可以通过查询的时候设置时区来解决:

 QueryBuilder rangeBuilder = QueryBuilders
                .rangeQuery("@timestamp")
                .format("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
                .timeZone("Asia/Shanghai") // 时区设置
                .gte(sevTime);

设置时区,可以让时间正确

 

其他:

希望有大佬解决了注解时间无法存成带时区格式的时间可以留言告诉我下解决方案!!

  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Java中实现ES时间范围查询可以使用ESJava API。以下是一个简单的示例代码,它演示了如何使用ESJava API在时间范围内查询文档: ``` import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.action.search.SearchType; import org.elasticsearch.client.Client; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.SearchHits; import org.elasticsearch.search.sort.SortOrder; import java.util.Date; public class ESQueryDemo { public static void main(String[] args) { Client client = null; // 这里需要初始化一个ES client // 定义查询时间范围 Date start = new Date(1483200000000L); // 2017年1月1日 Date end = new Date(1514736000000L); // 2018年1月1日 SearchResponse response = client.prepareSearch("your_index_name") .setTypes("your_type_name") .setSearchType(SearchType.DFS_QUERY_THEN_FETCH) .setQuery(QueryBuilders.rangeQuery("your_date_field_name") .from(start) .to(end) .includeLower(true) .includeUpper(true)) .addSort("your_sort_field_name", SortOrder.DESC) .setFrom(0).setSize(10).setExplain(true) .execute() .actionGet(); SearchHits hits = response.getHits(); System.out.println("Total hits: " + hits.getTotalHits()); for (SearchHit hit : hits) { // 处理查询结果 } } } ``` 在这个示例代码中,我们首先定义了查询的时间范围(start和end),然后使用ESJava API构建了一个时间范围查询(rangeQuery)。我们还指定了要查询的索引名称、类型名称、排序方式等。最后,我们执行查询并遍历结果集。 需要注意的是,这个示例代码中的时间范围查询是闭区间的,即包括起始时间和结束时间。如果你需要开区间的时间范围查询,只需要将includeLower和includeUpper参数设置为false即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值