kettle之时间转换异常

在使用Kettle进行数据处理时,发现特定日期的0时被莫名加1小时。该问题与1986年至1990年中国实施的夏令时有关。通过修改kettle的启动参数设置时区为GMT+8解决了这一问题。
昨天在进行数据抽取时,发现了一个很奇怪的现象,部分时间,在经过kettle表输入再输出时,发生了变化。
具体说来就是:在数据库中,时间是1988/04/10 00:00:00,但是在kettle表输入控件中,无论是预览还是输出,都变成了:1988/04/1001:00:00,小时莫名的加多了一小时,但并不是所有的时间都被加1,也不是所有日期的0时都被加1,1988/04/11 00:00:00就是正常的,如下两图所示:



经过定义错误处理,将有问题的时间输出,基本上都是几个特定的时间:1988/04/10 00:00:00、1987/04/12 00:00:00、1989/04/16 00:00:00、1990/04/15 00:00:00

经过搜索,只搜到一篇关于此问题的叙述,截图如下:



虽然原文的问题表现形式和我遇到的不太一样,原文是减小了一个小时,而我遇到的是加多了一个小时,但解决办法是有效的。
即在kitchen.bat和spoon.bat中的OPT变量中添加一段代码:"-Duser.timezone="GMT+8""  ,注意包含引号
在新版本的kettle中(5.4),kitchen.bat无需添加,因为新版本的kitchen.bat是调用的spoon.bat。

原因分析:相关资料显示,1986到1990年,我国实行了一段时间的夏令时,但是根据当时的规则我国当时的夏令时间调整是在凌晨2时,将时间调快一小时,即将:1986-05-04 02:00:00调整为1986-05-04 03:00:00,而时间测试的效果却是:1986-05-04 00:00:00调整为1986-05-04 01:00:00。而且kettle中,也没有在1986年9月14日将时间调整回来。而且如果按照夏令时制规则,5月4日后,每个小时都应该+1,直至夏令结束,而不是只加0点那一个小时。
然而,kettle中出现问题的日期又与我国实行夏令时制的时间想吻合,(解放前也有实行年份)。
最后猜测,可能是kettle的源码中,对这结果日期的0点进行了特殊处理,但是又没有按照当时实行夏令时制的规则来处理。所以造成了这样的问题。当然这只是臆测,也不一定对,我也不动java,看不了源码。
好在还有解决的办法。


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

周小科

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值