Datetime 在Pig的ToDate(unix)中指定时区

Datetime 在Pig的ToDate(unix)中指定时区,datetime,unix,apache-pig,Datetime,Unix,Apache Pig,在我的数据集中,我有Unix时间戳中的日期。我想在ApachePig中将它们转换为日期时间。为此,我可以使用所述的ToDate()函数。然而,我知道我的Unix时间戳是GMT/UTC,但是使用ToDate()转换将导致我的本地时区。在从Unix时间戳转换时,我不知道如何在此函数中指定时区。我不想在转换后手动调整日期时间,因为这是夏令时的一大难题。希望有人有一个好的建议,每一个帮助将被感谢 这里有一个例子: ToString( ToDate( (long)'1417145524000'), 'yy

在我的数据集中,我有Unix时间戳中的日期。我想在ApachePig中将它们转换为日期时间。为此,我可以使用所述的
ToDate()
函数。然而,我知道我的Unix时间戳是GMT/UTC,但是使用
ToDate()
转换将导致我的本地时区。在从Unix时间戳转换时,我不知道如何在此函数中指定时区。我不想在转换后手动调整日期时间,因为这是夏令时的一大难题。希望有人有一个好的建议,每一个帮助将被感谢

这里有一个例子:

ToString( ToDate( (long)'1417145524000'), 'yyyy-MM-dd hh:mm:ss' )

结果是(2014-11-28 04:04:32),这是CET中的时间,但我希望这是(2014-11-28 03:04:32)GMT中的时间。

这就是你要找的:

ToDate(userstring, format, timezone)

时区刺痛:

在Edwin的评论之后:

在此特定情况下,您可以执行以下操作:

ToDate(ToString(ToDate((long) ts), 'yyyy-MM-dd hh:ss:mm'), 'yyyy-MM-dd hh:ss:mm', 'timezone')

这就是你要找的:

ToDate(userstring, format, timezone)

时区刺痛:

在Edwin的评论之后:

在此特定情况下,您可以执行以下操作:

ToDate(ToString(ToDate((long) ts), 'yyyy-MM-dd hh:ss:mm'), 'yyyy-MM-dd hh:ss:mm', 'timezone')

顺便说一句,Pig的ToDate只使用GMT的偏移时区(多少小时+或)。 不是地理上的。用这种方法你可能会遇到夏令时的麻烦。 从午夜开始计算小时的时间差异:

2015-03-29 03:00:00+0200减去2015-03-29 00:00:00+0100等于4小时
但是

2015-03-29 03:00:00+0200(欧洲/布拉格)减去2015-03-29 00:00:00+0100(欧洲/布拉格)等于3小时。


使用Pig's ToDate,您只能实现前一种行为。

只是一个旁注,Pig's ToDate只使用偏移时区-多少小时+或-GMT。 不是地理上的。用这种方法你可能会遇到夏令时的麻烦。 从午夜开始计算小时的时间差异:

2015-03-29 03:00:00+0200减去2015-03-29 00:00:00+0100等于4小时
但是

2015-03-29 03:00:00+0200(欧洲/布拉格)减去2015-03-29 00:00:00+0100(欧洲/布拉格)等于3小时。


使用Pig的ToDate,你只能实现前一种行为。

1417145524000
是46877年7月21日,奇怪的是,在我的例子中,Pig做的恰恰相反:它在+0000时区显示日期,但我想要本地,不知道如何强制它。顺便说一句,我很确定你的意思是“yyyy-MM-dd HH:ss:MM”,因为lowecase h只给你1到12小时。
1417145524000
是46877年7月21日。奇怪的是,在我的情况下,Pig的作用正好相反:它在+0000时区显示日期,但我想要本地的,不知道如何强制。顺便说一句,我很确定你的意思是“yyyy-MM-dd HH:ss:MM”,因为LowerCase h只会给你1到12个小时的时间。我认为,到目前为止,它使用的是用户字符串(chararray),但不会像我所说的那样使用长毫秒。还是我错了?是的,你是对的,我只是在答案中加入了一轮工作,我希望这会有所帮助。到目前为止,这对用户字符串(chararray)是有效的,但我认为不会像我这样以毫秒为单位的长时间工作。还是我错了?是的,你是对的,我只是在答案中加入了一轮工作,我希望这会有所帮助。