Core Data 转 Unix 时间戳转换器
把 Core Data 转换为 Unix 时间。精确公式与大数支持。输出:秒、毫秒、ISO 8601 与可读格式。
自 2001-01-01 UTC 以来的秒数
当前时间 — Core Data 时间戳—
Unix 时间戳(秒)—
什么是 Core Data 时间戳?
Apple 的 Core Data 框架将 Date 属性存储为自 2001 年 1 月 1 日 00:00:00 UTC 以来的秒数——与 macOS 和 iOS 通用的 CFAbsoluteTime 参考日期相同。当你在 SQLite 中直接打开 Core Data 存储时,日期列(通常名为 Z…DATE)会以这些基于 2001 的浮点值出现。
- 纪元:2001-01-01 00:00:00 UTC
- 类型:浮点秒(保留亚秒精度)
- 常见于:Core Data 的 SQLite 存储、ZDATE / Z_…_DATE 列、导出的 .sqlite 数据库
- 与 NSDate timeIntervalSinceReferenceDate 的参考日期相同
如何将 Core Data 时间戳转换为 Unix 时间
加上 1970 与 2001 之间 978,307,200 秒的差,把 Core Data 值重新基准到 Unix 纪元。
- Unix seconds = CoreDataTimestamp + 978307200
- 示例:721692800 → 1700000000 → 2023-11-14 22:13:20 UTC
- SQLite: datetime(ZDATE + 978307200, "unixepoch")
- 反向:CoreDataTimestamp = Unix seconds − 978307200
查询 Core Data 的 SQLite 存储
在取证和调试中直接读取 Core Data 数据库很常见。由于值基于 2001,遗忘偏移会把每个日期前移约 31 年。负值是合法的,表示 2001 年之前的日期。
- 列名通常以 Z 为前缀(Core Data 的内部命名)
- 值 0 表示 2001-01-01,常用作默认/未设置日期
- 时间以 UTC 存储;之后再应用显示时区
相关时间戳格式转换器
直接读取 Core Data 的 SQLite
在不使用框架的情况下检查 Core Data 的 .sqlite 存储时:
- 实体表以 Z 为前缀(如 ZUSER);日期属性列会再加一个 ZDATE 风格的前缀
- ZDATE 值是浮点 CFAbsoluteTime——加上 978307200 得到 Unix 时间戳
- ZDATE 列中的 NULL 或 0.0 表示日期从未设置(或被设为参考日期本身)
- Z_PRIMARYKEY 表将实体 ID 映射到行 ID,但不包含日期
- 为便于查询阅读:在 SQLite 中用 datetime(ZDATE + 978307200, "unixepoch")
FAQ
- Core Data 使用哪个纪元?
- Core Data 把日期存为自 2001 年 1 月 1 日 00:00:00 UTC 以来的秒数,与 CFAbsoluteTime/NSDate 的参照日期相同。
- 如何把 Core Data 的 ZDATE 转换为真实日期?
- 给该值加上 978,307,200 得到 Unix 时间戳,然后格式化——例如 SQLite datetime(ZDATE + 978307200, "unixepoch")。
- 为什么我的 Core Data 日期差了 31 年?
- 你很可能把以 2001 年为基准的值当作 Unix 时间戳了。加上 978,307,200 秒的偏移即可修正。