You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NiFi中如何将JSON文件内的epoch时间转换为指定格式时间戳

问题根因

两类异常均为配置不符合处理器运行规则导致:

  • 原始createTime值是13位毫秒级epoch时间戳,无需额外乘1000或拼接000。Jolt配置里的append('000')会把数值转成16位字符串,时间解析溢出后直接返回1970纪元初始时间。
  • UpdateRecord抛出NumberFormatException是因为字段类型不匹配:createTime默认按数值类型处理,直接写入格式化后的时间字符串时,处理器会尝试把字符串反向解析为数值,必然触发类型转换错误。

可行配置方案

方案1:UpdateRecord(兼容性最好,优先选择)

按以下步骤调整配置:

  1. 将Record Reader/Writer关联的Schema中createTime字段类型修改为string,如果使用自动推断Schema,直接在Writer配置里开启字段类型覆盖即可。
  2. Replacement Value Strategy设置为Record Path Value
  3. 新增动态属性:
    • 属性名:/createTime
    • 属性值:${field.value:toNumber():format("yyyy-MM-dd HH:mm:ss.SSS", "GMT")}

    时区参数按需替换,例如东八区填Asia/Shanghai,美东时间填America/New_York,匹配你预期的3:34:03输出即可。

  4. 不要额外添加multiply(1000)或字符串拼接逻辑,原始毫秒级时间戳可直接传入format函数解析。

方案2:JoltTransformation

注意不要直接在shift规则里写NiFi表达式,低版本NiFi不支持该用法,使用modify规则链配置:

  1. Jolt Transform DSL选择chain模式
  2. 转换规则填入以下内容:
[
  {
    "operation": "modify-overwrite-beta",
    "spec": {
      "createTime": "${createTime:toNumber():format('yyyy-MM-dd HH:mm:ss.SSS', 'GMT')}"
    }
  }
]

如果配置后仍然输出1970年时间,说明当前NiFi版本的Jolt处理器不支持在转换规则中直接执行EL时间函数,直接换用UpdateRecord方案即可。


结果验证

传入测试数据{"createTime": 1510932843000},匹配对应时区参数后即可得到预期的2017-11-17 3:34:03.000输出。

内容的提问来源于stack exchange,提问作者Maykid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 20:54:35