【问题标题】:Process ISO8601 timestamps with offsets in Pentaho Data Integration在 Pentaho 数据集成中处理带有偏移量的 ISO8601 时间戳
【发布时间】:2014-05-17 03:23:28
【问题描述】:

在 Pentaho 的数据集成(又名 PDI 和 Kettle)中,我想对 ISO 8601 格式并具有 timezone 偏移信息的日期和时间进行一些处理。例如:

2013-07-26T18:00:00-07:00

在撰写本文时,已知 Kettle does not understand this date format(尽管其标准化 26 多年前和至少一个后续 PSA)。

如何在不借助字符串解析的情况下对这些数据进行操作?

【问题讨论】:

    标签: kettle iso8601 datetimeoffset


    【解决方案1】:

    我花了好几个小时才弄明白,所以我发布了问答风格,希望能帮别人省去麻烦。

    PDI 附带一个名为User Defined Java Expression (UDJE) 的转换步骤,它可以接收字段并在这些字段上输出Java 表达式的结果。它还可以访问Joda-Time library。 Joda 早餐吃 ISO8601。

    Java 表达式:

    org.joda.time.format.ISODateTimeFormat.dateTimeNoMillis().parseDateTime(dt8601)
    

    将输入一个字段dt8601,并为您留下一个可以处理日期的Joda DateTimeFormatter。就我而言,我想convert to Unix time,所以我的完整表达是:

    org.joda.time.format.ISODateTimeFormat.dateTimeNoMillis().parseDateTime(dt8601).getMillis() / 1000L
    

    对于 UDJE 中的其他字段,“新字段”是您要赋予此表达式的结果的字段名称,“值类型”必须是整数(在 PDI 中,对应于 Java 的 Long)。

    另外,有几个关于无效方法的警示故事:

    • 使用“Modified Java Script Value”步骤。你会认为也许你可以使用Date.parse,但我得到的只是NaN。这一步捆绑了一堆自定义日期/字符串转换函数,但没有一个处理时区或 ISO8601。我发现该步骤的documentation 缺乏清晰度和示例,因此放弃了。
    • 按照Pentaho forums postSO Q&A 中的建议,将javax.xml.bind.DatatypeConverter.parseDateTime(dt8601).getTime() 用于UDJE 表达式。这利用了一个 XML DatatypeConverter 并返回一个您可以进一步处理的 Calendar 对象。正如海报所指出的,XML 日期只是“inspired by”ISO8601。这可能会起作用,但我已经厌倦了编写日期处理代码,并且想要一些严格符合国际标准的东西。

    【讨论】:

    • 正确答案,但您可能还需要考虑分配时区。您的输入字符串指定与 UTC 的偏移量。但是时区是一个偏移量加上一组有关异常的当前和过去规则,例如夏令时 (DST)。调用withTimeZone 以根据第一个实例生成一个新实例,但应用了指定的时区。
    • @BasilBourque 好点。我已经更正了问题以反映区别。因为我不做日期算术,所以我会为此放弃时区。顺便说一句,我假设您的意思是 withZone 而不是 withTimeZone
    【解决方案2】:

    不确定这在 PDI 中的什么时候发生了变化,但我可以通过将 aa 字段指定为日期格式为 yyyy-MM-dd'T'HH:mm:ss.SSSXXX 来解析 ISO-8601 日期时间,例如 2017-03-20T13:26:29.681-07:00(请注意,没有引号XXX 左右,正常情况下)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-13
      相关资源
      最近更新 更多