You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

UNIX时间戳与本地时间互转丢失一小时问题排查

时间戳转本地时间丢失一小时的问题排查与解决

问题现象

执行以下命令验证时间戳转换异常:

~ $ date +%z; date; date -u; date -u +%s
+0200
Sat 24 Sep 2022, 00:02:35, CEST
Fri 23 Sep 2022, 22:02:35, UTC
1663970555

~ $ date -d "1970/01/01 + 1663970555 sec"; date -u -d "1970/01/01 + 1663970555 sec"
Fri 23 Sep 2022, 23:02:35, CEST
Fri 23 Sep 2022, 22:02:35, UTC

可见当前本地时间为Sat 24 Sep 2022, 00:02:35 CEST,对应的UTC时间戳是1663970555,但用date -d "1970/01/01 + 1663970555 sec"转换出的本地时间比实际晚1小时。

问题原因

核心问题在于GNU date解析"1970/01/01 + N sec"格式时,会将起始日期1970-01-01识别为本地时间,而非UTC时间。

你的时区是CEST(UTC+2),1970-01-01的本地时间对应UTC的1969-12-31 22:00:00。以此为起点加上1663970555秒,最终结果自然比直接转换UTC时间戳的结果少1小时——起始时间本身就差了1小时。

正确解决方法

直接使用date的@语法解析UTC时间戳,这是最简洁可靠的方式:

date -d @1663970555

执行后会直接输出预期的本地时间:Sat 24 Sep 2022, 00:02:35 CEST。

临时解决方案评估

你使用的临时命令:

date -ud "1970/01/01 + ${seconds} sec `date +%:::z`"

逻辑上是通过拼接时区偏移,让date -u基于UTC起始点计算,再转换为本地时间。虽然能得到正确结果,但属于冗余方案:写法复杂(需转义反引号),且依赖当前时区偏移值。相比之下,date -d @<时间戳>的写法更直观、兼容性更好(所有GNU date版本均支持)。

内容的提问来源于stack exchange,提问作者Michele Frau

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 18:20:55