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

问题描述 投票:0回答:1

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

pentaho pentaho-spoon pentaho-data-integration
1个回答
1
投票

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

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

所以,如果你拿第一个时间戳,当你将01:22:23设置为日期字段时,你实际上将它设置为“1 Jan 1970 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步骤中解析值并进行数学运算,而无需借助日期解析。

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

  • 将字段转换为日期时,将时区明确设置为+0000;
  • 将计算机的时区更改为UTC。
© www.soinside.com 2019 - 2024. All rights reserved.