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