Mac 绝对时间 / CFAbsoluteTime 是从 2001-01-01T00:00:00Z 起算的秒数。它的源纪元和单位必须跟着一起走——光看数字,你没法知道它属于哪块钟。
换算公式
Unix 秒 = Mac 绝对时间 + 978307200
转换器按这个关系给出 Unix 秒、epoch 毫秒、ISO 8601 UTC 和可读的 UTC 值。排查日志或导出数据时,请把原始值也留着,方便日后复核换算是否正确。
容易出错的地方
Apple 的时间戳看起来就像普通的秒数,但用的是 2001 纪元。别不加偏移就直接丢进 Unix 转换器。
更稳妥的做法
- 动手算之前,先确认平台和字段名。
- 数值可能超出 JavaScript 安全整数范围时,用字符串保留原始值。
- 在边界上一次性转换完,之后只存储和比较单位明确的 Unix 值。
- 只有在把结果呈现给人看时,才用具名时区做格式化。
相关格式转换器
Frequent questions:
- Q: CFAbsoluteTime 的纪元是什么?
- A: CFAbsoluteTime 计的是自 2001 年 1 月 1 日 00:00:00 UTC 起的秒数,也就是 Core Foundation/Cocoa 的参考日期。
- Q: 怎么把 Mac 绝对时间转成 Unix 时间?
- A: 给 Mac 绝对时间加上 978,307,200 秒,就得到以秒计的 Unix 时间戳。
- Q: Mac 绝对时间和 Core Data 时间戳一样吗?
- A: 一样。Core Data 就是用 CFAbsoluteTime(2001 起算的秒数)存日期的,换算方式完全相同。