在Pentaho数据集成中处理带有偏移的ISO8601时间戳

时间:2014-05-17 03:23:28

标签: kettle iso8601 datetimeoffset

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

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

截至撰写本文时,已知Kettle does not understand this date format(尽管26年前标准化PSA以及之后至少有一次{{3}})。

如何在不使用字符串解析的情况下对此数据进行操作?

2 个答案:

答案 0 :(得分:3)

我花了好几个小时才弄明白,所以我发布了Q& A风格,希望能帮助别人解决问题。

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中的其他字段,"新字段"是您要为此表达式的结果赋予的字段名称,以及"值类型"必须是Integer(在PDI中,它对应于Java的长)。

另外,关于不起作用的方法的几个警示故事:

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

答案 1 :(得分:1)

Not sure at what point this changed in PDI, but I'm able to parse an ISO-8601 datetime such as 2017-03-20T13:26:29.681-07:00 by specifying a a field as date with a format of yyyy-MM-dd'T'HH:mm:ss.SSSXXX (note that there are no quotes around XXX as there normally would be)