首页/开发/正则与编码速查/时间戳与可读时间的互转

时间戳与可读时间的互转

Unix 时间戳是以 1970-01-01T00:00:00Z 为原点的秒计数,本身是 UTC 时刻、不计闰秒,显示时才套用时区。互转要用专用函数,注意单位、时区与 32 位溢出边界,不同体系的时间起点也不同。

正则与编码速查开发更新于 2026-10-17
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌‌​​‌​​‌‌​​‌​‌​‌‌​​‌‌‌​‌‌​​‌​‌​‌‌‌‌​​​​​‌​‌‌‌‌​‌‌​​‌​‌​‌‌‌​​​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌​‌​​​​​‌​‌‌​‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌​‌​‌‌​​‌​​​‌‌​​​​‌​‌‌‌​‌​​​‌‌​​‌​‌​‌‌‌​‌​​​‌‌​‌​​‌​‌‌​‌‌​‌​‌‌​​‌​‌​​‌​‌‌​‌​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌‌​​‌‌‌​‌‌​​‌‌​​‌​‌​‌‌‌​​‌​​‌‌‌​‌​​​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​

时间戳的定义与原点

Unix 时间戳是从 1970 年 1 月 1 日 00:00:00 UTC 起算的秒数,本身不含时区信息,也不含闰秒——规范上每天固定算 86400 秒,因此它表示的是 UTC 时刻,而不是「墙上时间」。往返转换的正确姿势是:先算成时刻,再按目标时区格式化;而不是直接对字符串做加减。

基本信息

原点1970-01-01T00:00:00Z,即 UTC 时刻零点
单位默认为秒,毫秒与微秒形式也普遍存在,入参必须确认
闰秒计入方式是不计闰秒,每天按 86400 秒计
时区时间戳本身无时区,显示时才套用偏移或时区名
上限受存储类型限制,32 位有符号秒计数会在 2038 年 1 月 19 日溢出

典型使用场景

  • 排查日志时间与业务记录对不上:确认两边都是 UTC 还是本地时间
  • 计算耗时与超时:两点时间戳相减是最稳的做法
  • 数据库与接口对时:统一以 UTC 存储,展示层再做时区换算
  • 分析历史数据:注意时区历史变化,简单加固定偏移会错
  • 写入配置或缓存键:时间戳比格式化字符串更安全

常用互转写法

常用互转写法
date -u -d @1700000000                 # GNU date:转成 UTC 可读时间
date -u +%s                            # 当前时间转时间戳
date -d @1700000000 '+%F %T %z'        # 按指定格式输出
python3 -c "import datetime as dt;print(dt.datetime.fromtimestamp(1700000000, dt.timezone.utc))"
python3 -c "import datetime as dt;print(int(dt.datetime(2023,11,15,tzinfo=dt.timezone.utc).timestamp()))"
node -e "console.log(new Date(1700000000*1000).toISOString())"      # JS 需要毫秒

工具对照

环境时间戳转时间时间转时间戳
GNU datedate -u -d @<秒>date -u +%s
Pythondatetime.fromtimestamp(ts, timezone.utc)int(dt.timestamp())
JavaScriptnew Date(ts*1000)Math.floor(Date.now()/1000)
PowerShellDateTimeOffset::FromUnixTimeSecondsToUnixTimeSeconds()
MySQLFROM_UNIXTIME(ts)UNIX_TIMESTAMP(dt)
32 位有符号秒计数最大值为 2147483647,对应 2038-01-19T03:14:07Z。老系统的定时字段、旧数据库字段与嵌入式设备容易踩到这条界线,迁移时把类型换成 64 位,并预留足够大的边界值做兼容。
不同体系的起点并不相同:Windows 文件时间以 1601 年为起点按 100 纳秒计数,.NET 的计时单位以公元 1 年为起点,电子表格的序列号以 1900 年前后为起点,GPS 以 1980 年 1 月 6 日为起点。跨体系换算必须先确认起点,再谈单位。

易错点

  • 不加时区参数做本地时间与 UTC 的互转:同一份时间戳在不同服务器上得到不同结果,日志排查时结论完全相反
  • 把时间戳直接当本地时间展示,用户看到的时间偏移了所在时区的差值,跨国业务尤其明显
  • 用 32 位整型存储秒计数,2038 年会溢出为负值,时间突然回到 1901 年
  • 在格式字符串与时区之间反复转换,夏令时切换时刻的本地时间可能不存在或重复,得到一小时偏差
  • 依赖系统默认时区做计算:容器镜像默认多为 UTC,与开发机结果不同,应显式指定时区

数据来源与参考

  • POSIX.1-2017:Seconds Since the Epoch 定义
  • Microsoft Learn:Windows FILETIME 与 DateTimeOffset 文档
  • Python 标准库文档:datetime 与 time 模块的时区处理

整理校对:其其网ICT文档中心 · 本页地址:docs.qiqicto.com/regex/epoch-to-datetime-convert.html

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌‌​​‌​​‌‌​​‌​‌​‌‌​​‌‌‌​‌‌​​‌​‌​‌‌‌‌​​​​​‌​‌‌‌‌​‌‌​​‌​‌​‌‌‌​​​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌​‌​​​​​‌​‌‌​‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌​‌​‌‌​​‌​​​‌‌​​​​‌​‌‌‌​‌​​​‌‌​​‌​‌​‌‌‌​‌​​​‌‌​‌​​‌​‌‌​‌‌​‌​‌‌​​‌​‌​​‌​‌‌​‌​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌‌​​‌‌‌​‌‌​​‌‌​​‌​‌​‌‌‌​​‌​​‌‌‌​‌​​​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​