/** * 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時區改成東八區後顯示正常。索引
時區問題,萬變不離其宗,搞清楚原理後,任意數據怎麼變化,咱們都可以有方法應對,但願這篇文章對你有所幫助。開發
歡迎來公衆號【俠夢的開發筆記】 一塊兒交流進步字符串