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 の基準日です。Core Data ストアを SQLite で直接開くと、日付列(多くは 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 秒のオフセットを足して修正してください。