将字符串转换为时间戳配置单元

时间:2013-10-14 21:28:46

标签: hadoop hive hortonworks-data-platform

我有时间戳值的字符串,例如" 2013-02-02T04:04:11.240-4:00"。

所以目标是转换时间戳格式,如2013-02-02 04:04:11。我怎么能这样做。

此命令正常

from_unixtime(unix_timestamp(substr(' 20130502081559999',1,14),' yyyyMMddHHmmss'))

但是当我尝试这样的事情时,会给出错误的&#39; <&#39;

from_unixtime(unix_timestamp(substr(&#39; 2013-05-02T08:15:59.999-4:00&#39; 1,19),&#39; yyyy-MM-ddTHH:mm:ss&#39 ;))

1 个答案:

答案 0 :(得分:5)

对于除时区偏移之外的字符串中的所有内容,此模式将起作用:

from_unixtime(unix_timestamp("2013-02-02T04:04:11.240", "yyyy-MM-dd'T'HH:mm:ss.SSS"))

SimpleDateFormat的模式是here

附加模式XXX应该处理您的时区偏移。但正如this pagethis page所述,X模式是在Java 7中引入的。

如果你正在运行早期版本的Java(像我一样 - 我的Cloudera QuickStart VM使用1.6.0_32),你将不得不做一些额外的操作来实现它。一种方法是:

from_unixtime(unix_timestamp( 
    regexp_replace(
        regexp_replace("2013-02-02T04:04:11.240-4:00", "(.*):(.{2})$", "$1$2"),
    "(.*)-(.{3})$", "$1-0$2"), 
"yyyy-MM-dd'T'HH:mm:ss.SSSZ"))

最里面的regexp_replace将冒号(:)移出时区偏移量。如果需要,最外面的regexp_replace用额外的零填充时区偏移量(即-4:00变为-0400,与Z模式匹配。注意-400与Z模式不匹配)。