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