2015-11-17 51 views
0

在我的數據集中,我有Unix時間戳中的日期。我想將這些轉換爲Apache Pig中的日期時間。爲此,我可以使用ToDate()函數,如here所述。但是我知道我的Unix時間戳是GMT/UTC,但使用ToDate()進行轉換將導致我的本地時區。從Unix時間戳轉換時,我看不到如何在此函數中指定時區。我不想在轉換後手動調整日期時間,因爲這對夏時制來說是一個巨大的痛苦。希望有人有一個好的建議,每一個幫助將不勝感激。在Pig中指定ToDate(unix)的時區

這裏的示例:

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

結果(2014年11月28日4時04分32秒),這是在CET的時間,但是我希望這是(2014年11月28日03:格林威治標準時間04:32)。

+1

'1417145524000'是7月21日,46877 – gobrewers14

+0

剝離msec部分 – kecso

+0

奇怪,在我的情況下,豬完全相反:它顯示+0000時區的日期,但我想本地,不知道如何強制它。 順便說一句,我敢肯定你的意思是'yyyy-MM-dd ** HH **:ss:mm',因爲lowecase h只會給你1到12的小時。 –

回答

2

這是你在找什麼:

ToDate(userstring, format, timezone) 

https://pig.apache.org/docs/r0.11.1/func.html#to-date

時區蜇傷: http://joda-time.sourceforge.net/timezones.html

埃德溫的評論後:

在你能做到這一點的具體情況這個:

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

這可以和用戶字符串(chararray)迄今爲止,但我認爲,並非如我所知的那樣長達數十毫秒。或者我錯了? – Edwin

+0

是的你是對的,我只是把答案加入到答案中,我希望這會有所幫助。 – kecso

0

只是一個側面說明,豬的ToDate使用偏移量的時區 - 多少小時+或 - 的GMT。 不是地理的。這樣可以避免夏令時的麻煩。 考慮從午夜開始計算時間(小時)的區別: 2015-03-29 03:00:00+0200 minus 2015-03-29 00:00:00+0100 is 4 hours 2015-03-29 03:00:00+0200 (Europe/Prague) minus 2015-03-29 00:00:00+0100 (Europe/Prague) is 3 hours.

用豬的TODATE,則只能達到以前的行爲。