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,这个是自己定义的名字

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

QYHuiiQ

听说打赏的人工资翻倍~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值