在Pentaho的数据集成(又名PDI和Kettle)中,我想对ISO 8601格式的日期和时间进行一些处理,并且有 timezone 抵消信息。例如:
2013-07-26T18:00:00-07:00
截至撰写本文时,已知Kettle does not understand this date format(尽管26年前标准化PSA以及之后至少有一次{{3}})。
如何在不使用字符串解析的情况下对此数据进行操作?
答案 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的长)。
另外,关于不起作用的方法的几个警示故事:
Date.parse
,但我得到的只是NaN。这一步捆绑了一堆自定义日期/字符串转换函数,但没有处理时区和ISO8601。我发现步骤的documentation缺乏清晰度和例子而放弃了。javax.xml.bind.DatatypeConverter.parseDateTime(dt8601).getTime()
作为UDJE表达式,如Pentaho forums post和SO 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)