在Pentaho中将时间转换为分钟(PDI脚本)

时间:2017-12-20 08:29:20

标签: pentaho pentaho-spoon pentaho-data-integration

我想计算PDI中各种交易的活动时间总和(HH:mm:ss)。例如,考虑3个活动时间:1)活动1 - 01:22:03, 2)活动2 - 01:10:11和3)活动3 - 00:22:20。所有这些时间的总和应该是02:54:34,但结果显示负值。我该如何改进?

1 个答案:

答案 0 :(得分:1)

我几乎是偶然遇到了你的问题(和解决方案)。值得详细解释。

日期字段不适用于持续时间。他们定义了瞬间。如果您定义一个没有日期部分的日期字段,那么您实际上将其定义为1970年1月1日的瞬间,这是Unix时间的开始。

所以,如果你拿第一个时间戳,当你将01:22:23设置为日期字段时,你实际上将它设置为" 1970年1月1日01:22:23"。您希望此字段以秒为单位返回4923它的值(例如,在Javascript上使用getTime())。这对你的计算很有帮助;然后你可以添加它们,并重新格式化显示。

但是,如果您在设置日期值时未指定时区,则日期字段将使用您的LOCAL时区设置来定义该时间。

所以,如果您在纽约时区,将01:22:23定义为日期字段,格式为HH:mm:ss将返回" 1969年12月31日6:22:23 UTC",以秒为单位返回22923。

如果您在1970年1月1日之前在巴黎或其他城市领先于UTC,那么您的部分或全部工作时间可能会返回负值。

我说我偶然遇到它的原因是因为我在伦敦工作,冬天应该是UTC。然而,奇怪的是,1970年并非如此(见UNIX timestamp(0): Europe/London returns UTC+1

所以,在计算伦敦时区的时间戳时,我得到了:

本地时间,Unix时间内的秒数

1:22:03,1323

1:10:11,611

0:22:20,-2260

这些数字加起来为-326。

我的建议:

  1. 不要将持续时间定义为日期或时间戳;那不是他们的意思。持续时间是时间间隔。无论您测量它的年,日或时区,1小时的持续时间都是相同的。

  2. 相反,只需在javascript步骤中解析值并进行数学运算,而无需借助日期解析。

  3. 黑客解决问题(我不推荐):

    • 将字段转换为日期时,将时区明确设置为+0000;

    • 将您计算机的时区更改为UTC。