⏱️

アーカイブファイルフォーマットのタイムスタンプまとめ

2025/01/21に公開

はじめに

この記事は、Rustのzipクレートで「NTFS Extra Field」を読み取れるようにするパッチを書いたときに、他のアーカイブファイルフォーマットのタイムスタンプの精度やどの情報が格納できるかなどが気になったので調べた結果をまとめたものです。

tar

フォーマット 精度 atime mtime ctime
v7 1秒
ustar 1秒
gnu 1秒
pax 任意

どのフォーマットでもタイムスタンプはUnix時間で表現されますが、v7とustarの場合は「1970-01-01 00:00:00 UTC」から「2242-03-16 12:56:31 UTC」に範囲が制限され、gnuではより広い範囲のタイムスタンプを格納できます。

paxは拡張ヘッダに文字列として格納され、精度は通常1ナノ秒です。
paxは対応していない環境ではustarとして扱われます。

7z

精度 atime mtime ctime
100ナノ秒

7zはタイムスタンプにWindowsのファイル時刻を使用します。
これは「1601-01-01 00:00:00 UTC」から経過した100ナノ秒間隔の数を表す64ビット値です。
従って、「+60056-05-28 05:36:10.955161500 UTC」まで表すことができますが、多くの環境では符号付き64ビット整数型の最大値の「+30828-09-14 02:48:05.477580700 UTC」に制限されています。

ZIP

精度 atime mtime ctime
2秒

ZIPはタイムスタンプにMS-DOSの日付と時刻を使用します。
範囲は「1980-01-01 00:00:00」から「2107-12-31 23:59:58」で、精度は2秒です。

ただし、ZIPの拡張フィールドによって組み込み以外のタイムスタンプを格納することもできます。
以下ではいくつかの拡張フィールドを取り上げます。

拡張フィールド 精度 atime mtime ctime
NTFS Extra Field 100ナノ秒
UNIX Extra Field 1秒
Extended Timestamp Extra Field 1秒
Info-ZIP Unix Extra Field (type 1) 1秒

NTFS Extra Fieldは7zのタイムスタンプと同様にWindowsのファイル時刻を格納します。
UNIX Extra Field、Extended Timestamp Extra Field、Info-ZIP Unix Extra Field (type 1)は符号付き32ビットのUnix時間を格納します。
拡張フィールドを扱えるかはZIP処理系に依存します。

参考文献

GitHubで編集を提案

Discussion