Kettle 在Pentaho数据集成中使用偏移量处理ISO8601时间戳

Kettle 在Pentaho数据集成中使用偏移量处理ISO8601时间戳,kettle,iso8601,datetimeoffset,Kettle,Iso8601,Datetimeoffset,在Pentaho的数据集成(又名PDI和Ketter)中,我想对格式和时区偏移信息的日期和时间进行一些处理。例如: 2013-07-26T18:00:00-07:00 在写这篇文章时,大家都知道(尽管它在几年前已经标准化了,并且至少有一次是后来的) 如何在不借助字符串解析的情况下对这些数据进行操作?我花了好几个小时才弄明白,所以我发布了问答风格,希望能为其他人省去麻烦 PDI附带了一个名为(UDJE)的转换步骤,它可以接收字段并输出这些字段上Java表达式的结果。它还可以访问。乔达早餐吃ISO

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

2013-07-26T18:00:00-07:00
在写这篇文章时,大家都知道(尽管它在几年前已经标准化了,并且至少有一次是后来的)


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

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

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

Java表达式:

org.joda.time.format.ISODateTimeFormat.dateTimeNoMillis().parseDateTime(dt8601)
将接收一个字段
dt8601
,并给您留下一个可以处理日期的Joda。在我的情况下,我想,所以我的充分表达是:

org.joda.time.format.ISODateTimeFormat.dateTimeNoMillis().parseDateTime(dt8601).getMillis() / 1000L
对于UDJE中的其他字段,“New field”是要为该表达式的结果指定的字段名,“Value type”必须是整数(在PDI中,它对应于Java的Long)

另外,还有一些关于无效方法的警示故事:

  • 使用“”步骤。你可能认为你可以用,但我得到的只是楠。此步骤附带了一系列自定义日期/字符串转换函数,但它们都不能处理时区或ISO8601。我发现这一步骤缺乏清晰性和示例性,于是放弃了
  • 对UDJE表达式使用
    javax.xml.bind.DatatypeConverter.parseDateTime(dt8601).getTime()
    ,如a和a中所建议的。这将使用XML并返回一个可以进一步处理的对象。但正如海报所指出的,XML日期仅为“ISO8601”。这可能会起作用,但我已经厌倦了编写日期处理代码,并且想要一些严格符合国际标准的东西

不确定这在PDI中发生了什么变化,但我能够解析ISO-8601日期时间,例如
2017-03-20T13:26:29.681-07:00
,方法是将一个字段指定为日期,格式为
yyyy-MM-dd'T'HH:MM:ss.SSSXXX
(请注意,XXX周围通常没有引号)

正确答案,但是,您可能还需要考虑分配时区。输入字符串指定与UTC的偏移量。但时区是一个偏移量加上一组当前和过去关于异常的规则,如夏令时(DST)。调用
withTimeZone
以基于第一个实例生成一个新实例,但应用了指定的时区。@BasilBourque Great point。我已经更正了这个问题以反映区别。因为我不做日期算术,所以我会为此放弃时区。顺便说一句,我想你的意思是用时区代替