elasticsearch watcher中時區轉換問題,並對日期進行格式化

由於在elasticsearch中保存的是UTC時區,如果我們想要對時區進行轉換,可以在transform中用script的方式操作:

"transform": {
    "script": {
        "source": "def docs=[];for(item in ctx.payload.hits.hits) {def document = ['field1': item._source.field1,'timefield': LocalDateTime.ofInstant(Instant.parse(item._source.timefield), ZoneId.systemDefault()),'field3': item._source.field3];docs.add(document);} return ['_doc': docs];",
        "lang": "painless"
    }
}

//這裏面我的時區設置的是系統所在的時區。如果是想設置指定的時區,可以使用
LocalDateTime.ofInstant(Instant.parse(item._source.timefield), ZoneId.of("Asia/Shanghai"))
如果是EST時區,可以使用
LocalDateTime.ofInstant(Instant.parse(item._source.timefield), ZoneId.of("America/New_York"))

//Instant有不同的解析方法,這裏我使用的是parse()是對字符串類型的日期進行解析,也有對timstamp毫秒數進行解析的方法,具體可以根據場景選擇。

//如果是在此過程中還想對日期的格式進行格式化,如原始的"2020-01-14T14:23:45.000Z"想轉換成"01-14-2020 02:23:45 PM"
可以使用如下函數:
在for循環之前新定義變量:def dtf = DateTimeFormatter.ofPattern(\"MM-dd-yyyy hh:mm:ss a\");
然後在for循環中對日期進行格式化:
'timefield': dtf.format(LocalDateTime.ofInstant(Instant.parse(item._source.timefield), ZoneId.systemDefault()))



//在上述的transform情況下,如果想對字段值進行提取,比如在email action中使用表格形式發送時:
"body": {
    
    "html": "<table><tr><th>name</th><th>age</th><th>sex</th></tr> {{#ctx.payload._doc}} <tr><td> {{name}} </td><td> {{age}} </td><td> {{sex}} </td></tr> {{/ctx.payload._doc}} </table>"

}//這裏面的 payload後面是_doc是因爲我在transform中最後返回了_doc,這個是自己定義的名字

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章