如何在Apache NiFi中将JSON中的时间戳转换为日期时间?
解决方案:时间戳转指定格式日期
当然可以搞定这个时间戳转日期的需求!不管是用通用脚本工具,还是你提到的NiFi表达式语言,都有对应的解决方案,我来给你详细拆解下:
一、通用脚本实现(以Python为例)
如果只是想快速转换这个JSON,用Python处理是最直接的,代码逻辑清晰,还能灵活调整时区和日期格式:
import json from datetime import datetime import pytz # 你的输入JSON input_data = { "preMarket_timestamp": 1646830062, "regularMarket_timestamp": 1646773204, "earningsTimestamp": 1643301000, "earningsTimestampStart": 1651003200, "earningsTimestampEnd": 1651521600 } def convert_timestamp(timestamp, date_format="%Y/%m/%d %H:%M:%S", timezone="Asia/Shanghai"): # 把秒级时间戳转成指定时区的日期字符串 utc_dt = datetime.utcfromtimestamp(timestamp).replace(tzinfo=pytz.utc) local_dt = utc_dt.astimezone(pytz.timezone(timezone)) return local_dt.strftime(date_format) # 批量转换所有字段 output_data = {key: convert_timestamp(value) for key, value in input_data.items()} # 输出结果 print(json.dumps(output_data, indent=2))
运行后就能得到你想要的格式,如果要把日期分隔符改成-,只需要把date_format参数改成"%Y-%m-%d %H:%M:%S"就行。
二、NiFi表达式语言实现(推荐)
如果你需要在NiFi数据流中完成这个转换,有两种常用方式:
方法1:使用UpdateRecord处理器
这是最直观的方式,通过NiFi表达式语言直接修改字段值:
- 添加
UpdateRecord处理器到你的数据流中。 - 配置
Record Reader为JsonTreeReader,Record Writer为JsonRecordSetWriter(确保输出是JSON格式)。 - 在
UpdateRecord的Record Path Values配置项中,为每个时间戳字段设置转换规则:
比如针对preMarket_timestamp字段:
如果你所有顶级字段都是秒级时间戳,可以用通配符批量处理,不用逐个配置:/preMarket_timestamp: ${field.value:toDate("x"):format("yyyy/MM/dd HH:mm:ss", "Asia/Shanghai")}
表达式解释:/*: ${field.value:toDate("x"):format("yyyy/MM/dd HH:mm:ss", "Asia/Shanghai")}field.value:获取当前字段的时间戳数值toDate("x"):把秒级时间戳转换为NiFi的日期对象(x代表Unix秒级时间戳,X是毫秒级)format(...):将日期对象格式化为指定字符串,第二个参数指定时区(这里用东八区Asia/Shanghai匹配你的输出时间)
方法2:使用JoltTransformJSON处理器
如果你熟悉Jolt规范,也可以用这个处理器来做转换,灵活性更高:
- 添加
JoltTransformJSON处理器。 - 在Jolt Specification中输入以下规则:
这个规则会遍历所有顶级字段,把每个数字时间戳转成指定格式的日期字符串,同样可以修改[ { "operation": "modify-overwrite-beta", "spec": { "*": "=formatTimestamp('yyyy/MM/dd HH:mm:ss', toDate(@(1), 'x'), 'Asia/Shanghai')" } } ]yyyy/MM/dd为yyyy-MM-dd来切换分隔符。
不管用哪种方法,都能完美实现你想要的转换效果,按需选择就好~
内容的提问来源于stack exchange,提问作者Tugrul Gokce
相关产品推荐
相关产品推荐

