Core Data Timestamp

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 秒的偏移即可修正。