/** * String timeZoneConvert = timeZoneConvert( * new Date().getTime() * , "yyyy-MM-dd'T'HH:mm:ss.SSSZ", * "Asia/Shanghai"); * * @param date 毫秒 * @param pattern format时间格式 * @param timeZone 时区 * @return 如:2019-12-30T16:32:07.616+0800 */ public static String timeZoneConvert(Long date,String pattern,String timeZone){ SimpleDateFormat simpleDateFormat=new SimpleDateFormat(pattern); simpleDateFormat.setTimeZone(TimeZone.getTimeZone(timeZone)); return simpleDateFormat.format(date); }
mutate{ gsub => [ "time", "[+]", "T" ] } mutate{ replace => ["time","%{time}+08:00"] }
或是:java
date { match => ["timestamp", "yyyy-MM-dd HH:mm:ss"] target => "my_timestamp" timezone => "+08:00" }
"aggs": { "by_day": { "date_histogram": { "field": "date", "interval": "day", "time_zone": "Asia/Shanghai" } } }
{ "AsiaTime":"2019-12-30T16:32:07.616+0800", "newDateTime":1577694727581, "localTimeNow":"2019-12-30T16:32:07.615", "systemCurrentTimeMilis":1577694727581, "newDate":1577694727581 }
默认不设置索引模板的状况,写入es后,咱们发现带 时区‘T’的数据类型为date。
json
接下来,咱们将轮流设置这两个字段为kibana的时间搜索字段,看看会发生什么。api
实验一:以localTimeNow作时间搜索字段,显示比数据时间晚了8小时。
3d
实验二:以AsiaTime作时间搜索字段,显示比数据时间早了8小时。
code
首先来讲实验一,为何kibana上显示的时比数据时间多8个小时呢?明明是30号的数据,愣是跑到31号去了?orm
这条数据 "localTimeNow":"2019-12-30T16:32:07.615"。带时区T,默认是UTC时区,
而kibana获取的时区配置是Asia/Shanghai,为东8区,至关于在原来的时间上加上8个小时显示,因此跑到31号去了。
用大腿想一下,你确定知道,这种状况下若是把kibana时区设置为UTC,固然数据就显示正常啦。blog
再来讲实验二, "AsiaTime":"2019-12-30T16:32:07.616+0800,因为上面设置了当前kibana时区为UTC,数据带东八区的时区,因此晚了8小时。同理将kibana时区改成东八区后显示正常。索引
时区问题,万变不离其宗,搞清楚原理后,任意数据怎么变化,咱们都可以有方法应对,但愿这篇文章对你有所帮助。开发
欢迎来公众号【侠梦的开发笔记】 一块儿交流进步字符串