[Kettle] CST时间格式转yyyy-MM-dd HH:mm:ss格式
发布时间
阅读量:
阅读量
在当前的需求开发过程中遇到了一个关键问题。项目方提供了一个加密的.dat文件进行解密,并发现存在一个时间戳字段,并且该字段采用的是CST格式存储。例如:Thu Jul 22 00:58:32 CST 2010。然而,在目标数据库中该字段被设计为timestamp类型,并可以使用Kettle工具来进行数据抽取。起初他们直接将该字段的数据类型转换为Date类型的变量,并将其格式化为yyyy-MM-dd HH:mm:ss的形式。经过反复测试发现这种方法不可行

于是转而寻找其他途径. 是否可以用Kettle提供的Java代码库以及JavaScript组件或脚本来实现这一目标呢?经过一番尝试后决定采用该方案.
JavaScript组件实现。
数据源:
本次测试基于date.csv文件进行操作,csv文件中存储的CST时间数据格式如下:

目标表:
PostgreSQL库创建目标表,用来接收。
create table t_string_conver_to_date(join_date timestamp without time zone );
ETL 程序设计程序

请配置获取文件指定路径 date.csv 并接收字段 IN_DATE 的数据值作为字符串处理(Note:此处不允许设置 Date 类型)

JavaScript代码: 主要是将CST格式转换成yyyy-MM-dd HH:mm:ss格式。
//自定义函数
function dateFormat (date, format) {
date = new Date(date);
date.setHours(date.getHours()-14);
var o = {
'M+' : date.getMonth() + 1, //month
'd+' : date.getDate(), //day
'H+' : date.getHours(), //hour
'm+' : date.getMinutes(), //minute
's+' : date.getSeconds(), //second
'q+' : Math.floor((date.getMonth() + 3) / 3), //quarter
'S' : date.getMilliseconds() //millisecond
};
if (/(y+)/.test(format))
format = format.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length));
for (var k in o)
if (new RegExp('(' + k + ')').test(format))
format = format.replace(RegExp.$1, RegExp.$1.length == 1 ? o[k] : ('00' + o[k]).substr(('' + o[k]).length));
return format;
}
var DATE_OUT = dateFormat(IN_DATE,"yyyy-MM-dd HH:mm:ss") //函数调用,输出字段资格,IN_DATE为文本文件传过来的数据流
设置如下,用DATE_OUT接收,类型为String。

字段设置: 字段设置涉及将 DATE_OUT 强制转换为DATE类型,并遵循日期格式yyyy-MM-dd HH:mm:ss。

表输出: 用于将DATE_OUT信息注入到目标表 t_string_conver_to_date.join_date字段中。

以上步骤都设置到了,启动Kettle 转换程序,然后查看表数据,验证OK。

全部评论 (0)
还没有任何评论哟~
