【问题标题】:Converting Time into Minutes in Pentaho (PDI Script)在 Pentaho 中将时间转换为分钟(PDI 脚本)
【发布时间】: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


    【解决方案1】:

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

    日期字段不适用于持续时间。他们定义瞬间。如果您定义一个没有日期部分的日期字段,您实际上将其定义为 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. 不要将持续时间定义为日期或时间戳;那不是他们的样子。持续时间是时间间隔。无论您测量它的年份、日期或时区,1 小时的持续时间都是一样的。

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

    解决问题的技巧(我不推荐):

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

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

    【讨论】:

    • 感谢您的回答@nsousa。我们按照您的建议使用 javascript(getTime()) 方法尝试了相同的操作,但它给出了负值。我们还尝试将活动时间的原始数据保存为数字格式,以便获得总和(活动时间)的预期结果;我们仍然得到负值。
    • 这正是我警告你的:你不能简单地在一个时间值上使用 getTime() ,而不指定时区。该函数返回时间戳,将该时间解释为您当地时区的 1970 年 1 月 1 日。如果 1970 年 1 月 1 日的本地时区早于 UTC,则有时会返回负时间戳。您需要添加或减去时区偏移量。
    • 只需将其解析为字符串:假设它是 HH:mm:ss 格式,用 ':' 分隔;将小时乘以 3600,将分钟乘以 60,然后将它们加起来。然后重新格式化以再次显示。但是您不能将仅时间字符串解析为日期字段并期望得到正确的结果,除非您指定 UTC(即使那样,您也不应该)。
    • 谢谢哥们,第二个选项对我有用。很好的解决方案!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-04
    • 2019-10-01
    • 2013-11-02
    • 1970-01-01
    相关资源
    最近更新 更多