2014-01-28 33 views
0

我試圖使用unix_timestamp()HiveQL函數將字符串日期「Sat Jan 25 00:13:31 +0000 2014」 轉換爲Unix Timestap。Apache Hive中的Unix_timestamp

轉換時間串給定的模式爲Unix時間戳(以秒計), 則返回0失敗:UNIX_TIMESTAMP( '2009-03-20', 'YYYY-MM-DD')= 1237532400

Java文檔 http://docs.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html#month

UNIX_TIMESTAMP( 「揚-2014」, 「MMM-YYYY」)在蜂巢返回NULL

的功能似乎只用一個整數(即MM)表示個月的工作。 解決方案?

回答

0

似乎令人難以置信,但與除一月(一月)其他月份它的工作原理...

unix_timestamp('Feb 1 18:41:57 +0000 2014','MMM dd HH:mm:ss Z yyyy') 
==> 1391280117 

一週不工作的一天的EEE模式...

0

解決了,問題是我的linux系統的本地化。

0

使用java.time

在Java方面,解析使用java.time類。 YearMonth類表示一年和一個月。

DateTimeFormatter f = DateTimeFormatter.ofPattern("MMM-yyyy"); 
YearMonth ym = YearMonth.parse("Jan-2014" , f); 

我們可以從該月的第一天,得到LocalDate

LocalDate today = ym.atDay(1); 

如果你想爲蜂巢的日期,唯一的價值,你給標準的SQL格式的字符串。對於僅限日期的值,SQL格式與ISO 8601格式一致。分析或生成字符串時,java.time類默認使用標準ISO 8601格式。

String output = today.toString(); // YYYY-MM-DD format per ISO 8601 standard. 

從那裏你顯然想要一個日期時間值。我們可以任意分配一天的第一時刻。日期和確定第一個時刻的含義取決於時區。對於任何特定時刻,日期和時間在全球各地按時區而不同。

ZoneId zoneId = ZoneId.of("America/Montreal"); 
ZonedDateTime zdt = today.atStartOfDay(z); 

從,你可以生成自1970年開始在UTC(1970-01-01T00:00:00Z)時代的一些整秒喂到蜂巢。

long secondsSinceEpoch = zdt.toEpochSecond(); 

走向另一個方向,則需要經過Instant類。 Instant類表示UTC中時間軸上的一個時刻,分辨率爲nanoseconds(小數點後最多九(9)位數字)。

Instant instant = Instant.ofEpochSecond(1_388_534_400L); 

如果您想查看某個地區的wall-clock time,請應用時區。

ZoneId zoneId = ZoneId.of("America/Montreal"); 
ZonedDateTime zdt = instant.atZone(z); 

關於java.time

java.time框架是建立在Java 8和更高版本。這些類取代的麻煩舊日期,時間類,如java.util.Date.Calendar,& java.text.SimpleDateFormat

Joda-Time項目現在位於maintenance mode,建議遷移到java.time。請參閱Oracle Tutorial。並搜索堆棧溢出了很多例子和解釋。

大部分的java.time功能後移植到Java 6 和ThreeTenABP還適於Android(見How to use…)。

ThreeTen-Extra項目擴展java.time與其他類。這個項目是未來可能增加java.time的一個試驗場。您可以在這裏找到一些有用的類,如Interval,YearWeek,YearQuartermore