如何使用CDAP将/Date(时间戳+时区)/格式转换为普通日期?
在CDAP中转换.NET风格日期格式为普通日期
没问题!我来帮你搞定CDAP里这种常见的.NET JSON日期格式转换~
这种/Date(1577746800000+0100)/格式是.NET序列化JSON时常用的日期格式,核心包含两部分:毫秒级Unix时间戳,以及时区偏移(比如+0100代表UTC+1时区)。下面给你两种在CDAP里的实用处理方案:
方案1:用Wrangler快速处理(推荐)
Wrangler是CDAP内置的可视化数据转换工具,几步就能完成批量转换:
第一步:提取时间戳和时区偏移
假设你的日期字段名叫raw_date,使用parse-as-regex函数匹配格式,把关键信息提取成单独字段:parse-as-regex ${raw_date} '/Date\\((\\d+)([+-]\\d{4})\\)/' timestamp:string, tz_offset:string执行后会生成两个新字段:
timestamp(比如1577746800000)和tz_offset(比如+0100)。第二步:转换为标准日期
用to-date函数把提取的信息转换成你需要的可读格式,比如生成YYYY-MM-DD HH:mm:ss格式的日期:to-date(to-timestamp(${timestamp}, "milliseconds"), "yyyy-MM-dd HH:mm:ss", ${tz_offset})如果只需要日期部分,把格式参数改成
"yyyy-MM-dd"就行。
方案2:自定义函数处理(复杂场景)
如果需要更灵活的逻辑(比如特殊格式输出、异常处理),可以用CDAP的Python/Java Transform写自定义函数,这里给个Python示例:
import re from datetime import datetime, timedelta def transform(record): raw_date = record.get('raw_date', '') # 匹配日期格式 match_result = re.match(r'/Date\((\d+)([+-]\d{4})\)/', raw_date) if match_result: # 转换时间戳为秒级(Python datetime默认用秒) timestamp_ms = int(match_result.group(1)) timestamp_s = timestamp_ms / 1000 # 解析时区偏移 tz_str = match_result.group(2) tz_hours = int(tz_str[:3]) tz_mins = int(tz_str[3:]) tz_delta = timedelta(hours=tz_hours, minutes=tz_mins) # 计算本地时间并格式化 utc_datetime = datetime.utcfromtimestamp(timestamp_s) local_datetime = utc_datetime + tz_delta record['formatted_date'] = local_datetime.strftime('%Y-%m-%d %H:%M:%S') return record
测试你的示例日期
用上面的方法处理你给出的示例,结果如下(以YYYY-MM-DD格式为例):
/Date(1577746800000+0100)/→ 2019-12-31/Date(1570572000000+0200)/→ 2019-10-09/Date(1558821600000+0200)/→ 2019-05-25/Date(1546297200000+0100)/→ 2018-12-31
如果在操作中遇到问题,比如字段名不匹配或者格式调整,随时调整表达式或函数里的参数就行~
内容的提问来源于stack exchange,提问作者nuxer
相关产品推荐
相关产品推荐

