Core Data 时间戳是从 2001-01-01T00:00:00Z 起算的秒数。只有当它的源纪元和单位一起传递时,这个数才有意义——数字本身不会告诉你它属于哪块钟。
换算公式
Unix 秒 = Core Data 秒 + 978307200
转换器按这个关系给出 Unix 秒、epoch 毫秒、ISO 8601 UTC 和可读的 UTC 值。排查日志或导出数据时,请把原始值也留着,方便日后复核换算是否正确。
容易出错的地方
Core Data 用的是和 CFAbsoluteTime 相同的 Apple 参考日期。不加上纪元偏移,它就不是 Unix 秒。
更稳妥的做法
- 动手算之前,先确认平台和字段名。
- 数值可能超出 JavaScript 安全整数范围时,用字符串保留原始值。
- 在边界上一次性转换完,之后只存储和比较单位明确的 Unix 值。
- 只有在把结果呈现给人看时,才用具名时区做格式化。
相关格式转换器
Frequent questions:
- Q: Core Data 用的是哪个纪元?
- A: Core Data 把日期存成自 2001 年 1 月 1 日 00:00:00 UTC 起的秒数,和 CFAbsoluteTime/NSDate 的参考日期一致。
- Q: 怎么把 Core Data 的 ZDATE 转成真实日期?
- A: 给这个值加上 978,307,200 得到 Unix 时间戳,再格式化即可——例如 SQLite 里 datetime(ZDATE + 978307200, "unixepoch")。
- Q: 为什么我的 Core Data 日期差了 31 年?
- A: 多半是把 2001 起算的值直接当成 Unix 时间戳用了。加上 978,307,200 秒的偏移就对了。