hive13位时间戳转换成时间:13秒的换算结果

把13作为hive13位时间戳转换成时间的输入时,结果是毫秒值13000,对应UTC时间1970-01-01 00:00:13。这个数值说明13位时间戳按毫秒解释,13000毫秒等于13秒。

在线工具时间戳转换

13这个参数算出来到底是什么

输入13,工具返回的unix字段是13,milliseconds字段是13000,iso是1970-01-01T00:00:13.000Z,utc是1970-01-01 00:00:13。这里容易混淆的是:13本身是毫秒数,但显示成UTC时是13秒,因为13000毫秒正好是13秒。如果你在Hive里拿到一个13位时间戳,它通常表示从1970-01-01 00:00:00 UTC起经过的毫秒数,13就代表经过了13毫秒,但工具展示的UTC时间把13000毫秒解释为13秒,这中间差了一个数量级。实际处理时,先确认字段是秒还是毫秒,再决定是否除以1000。

相邻参数对照:12、14和13的差别

把12、13、14放在一起看,能更清楚边界。输入12,毫秒是12000,UTC是1970-01-01 00:00:12;输入14,毫秒是14000,UTC是1970-01-01 00:00:14。13正好落在中间,毫秒13000,UTC 1970-01-01 00:00:13。三个值只差1,但换算后的秒数也各差1。这种对照在排查数据时很有用:如果Hive表里某列出现12、13、14这样的连续值,基本可以判断它是毫秒级时间戳,而不是秒级。

从13出发,反向换算怎么验证

反向验证可以从UTC时间倒推。1970-01-01 00:00:13对应的秒是13,乘以1000得到13000毫秒,与工具输出的milliseconds一致。如果拿到的13位时间戳是13,想还原成可读时间,先按毫秒处理,再格式化成UTC,就得到1970-01-01 00:00:13。若在Hive里用from_unixtime,注意它默认按秒处理,直接传13会得到1970-01-01 00:00:13,但传13000会得到1970-01-01 03:36:40,差别很大。所以先判断单位,再决定是否除以1000。

13位时间戳在Hive里的常见处理位置

Hive中13位时间戳常出现在日志表、埋点表或外部导入的JSON字段里。处理时一般先转成bigint,再除以1000取整,最后用from_unixtime转成字符串。如果只是临时查看,也可以借助时间戳转换工具直接输入13,看毫秒和UTC的对应关系。需要补充Java侧处理思路时,可以参考13位时间戳转换成时间java的实用教程,里面讲了Long和Date的转换细节。

容易踩的坑:13不是秒而是毫秒

很多人看到13就以为是13秒,但13位时间戳的“13位”指的是长度,不是数值大小。13作为数值只有两位,但它仍然按毫秒解释,所以13000毫秒对应13秒。如果误把它当秒,直接from_unixtime(13)会得到1970-01-01 00:00:13,看似正确,其实是因为13秒和13000毫秒在UTC显示上恰好都是00:00:13,这种巧合容易让人忽略单位问题。换一个值,比如3613,毫秒是3613000,UTC是1970-01-01 01:00:13,如果当秒处理就会得到完全不同的日期。

总结

13作为hive13位时间戳转换成时间的输入,得到毫秒13000、UTC 1970-01-01 00:00:13,本质是13秒的毫秒表示;对照12和14可以确认相邻值各差1秒。

相关文章

常见问题

Q1输入13,为什么毫秒显示13000而不是13?

因为13位时间戳按毫秒解释,输入13表示13毫秒,工具把毫秒值展开成13000,同时UTC显示为1970-01-01 00:00:13,对应13秒。

Q213和12、14的换算结果差多少?

12对应毫秒12000、UTC 1970-01-01 00:00:12;13对应13000、00:00:13;14对应14000、00:00:14,相邻值各差1秒。

Q3在Hive里直接把13传给from_unixtime会怎样?

from_unixtime默认按秒处理,传13会得到1970-01-01 00:00:13,和按毫秒处理13000后显示的UTC时间相同,但这是巧合,换其他值就会不一致。

Q413位时间戳转换成时间时,需要先除以1000吗?

如果目标函数按秒处理,需要先除以1000再取整;如果工具已经按毫秒解析,就不用再除。关键看下游函数对单位的约定。