【发布时间】:2017-12-20 08:29:19
【问题描述】:
我想计算 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
我想计算 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
我几乎是偶然遇到了您的问题(以及解决方案)。值得详细解释一下。
日期字段不适用于持续时间。他们定义瞬间。如果您定义一个没有日期部分的日期字段,您实际上将其定义为 1970 年 1 月 1 日的瞬间,这是 Unix 时间的开始。
因此,如果您使用第一个时间戳,那么当您将 01:22:23 设置为日期字段时,您实际上将其设置为“1970 年 1 月 1 日 01:22:23”。您希望该字段以秒为单位返回 4923 它的值(例如,在 Javascript 上使用 getTime())。这很适合您的计算;然后您可以将它们相加,然后重新格式化以显示。
但是,如果您在设置日期值时未指定时区,则日期字段将使用您的本地时区设置来定义该时间。
因此,如果您在纽约时区,将 01:22:23 定义为格式为 HH:mm:ss 的日期字段会返回“31 Dec 1969 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 小时的持续时间都是一样的。
相反,只需在 javascript 步骤中解析值并进行数学运算,而无需诉诸日期解析。
解决问题的技巧(我不推荐):
将字段转换为日期时,将时区显式设置为+0000;
将您计算机的时区更改为 UTC。
【讨论】: