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 の基準日です。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 秒のオフセットを足して修正してください。