1

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

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

该命令工作正常

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

但是当我尝试这样的事情时,它会给出“T”错误

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

4

1 回答 1

5

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

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

SimpleDateFormat 的模式在这里

附加模式 XXX 应该处理您的时区偏移。但正如本页本页所述,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 模式不匹配)。

于 2014-01-18T05:04:58.217 回答