javaesdate时间处理
最近在存储数据到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,就会造成时间少⼋⼩时
浏览器json格式化(2)没有jsonFormat,存储在es的是时间是long类型:
(3)格式化完成后,时间格式:
3.在kibana中,默认带时区的时间会根据浏览器所在的地区⾃动计算正确时间:
最新更新:
存的时间⽬前还是⽤时间戳的⽅式,但是logstash存储的时间可以通过查询的时候设置时区来解决:
QueryBuilder rangeBuilder = QueryBuilders
.rangeQuery("@timestamp")
.format("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
.timeZone("Asia/Shanghai") // 时区设置
.gte(sevTime);
设置时区,可以让时间正确
其他:
希望有⼤佬解决了注解时间⽆法存成带时区格式的时间可以留⾔告诉我下解决⽅案!!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论