これは、使用しているオペレーティング システムと、ファイルが存在するファイル システムの種類によって異なります。iOS を使用していると仮定します (この場合、iOS がたまたま使用するファイルシステムを使用しています)。
システム コールは、stat
いくつかのタイムスタンプを含むファイルに関する情報を という構造体で返しますstruct stat
。この構造体は、各タイムスタンプを として格納しstruct timespec
ます。にstruct timespec
は、秒フィールドtv_sec
とナノ秒フィールドが含まれていますtv_nsec
。したがって、理論的には、ファイルのタイムスタンプをナノ秒単位で取得できます。
実際には、2 番目の解像度のタイムスタンプしか取得できないようです。私はこのコードでテストしました:
struct stat sb;
stat([NSBundle.mainBundle pathForResource:@"Info" ofType:@"plist"].UTF8String, &sb);
iOS 5.0.1 を実行している iPhone 4S では、次の結果が得られました。
(gdb) p sb
$1 = {
st_dev = 234881033,
st_mode = 33188,
st_nlink = 1,
st_ino = 11265454,
st_uid = 501,
st_gid = 20,
st_rdev = 0,
st_atimespec = {
tv_sec = 1330753666,
tv_nsec = 0
},
st_mtimespec = {
tv_sec = 1330753664,
tv_nsec = 0
},
st_ctimespec = {
tv_sec = 1330753664,
tv_nsec = 0
},
st_birthtimespec = {
tv_sec = 1330417559,
tv_nsec = 0
},
st_size = 830,
st_blocks = 8,
st_blksize = 4096,
st_flags = 0,
st_gen = 0,
st_lspare = 0,
st_qspare = {0,
0}
}
すべてのフィールドが 0 であることがわかりますtv_nsec
。これは偶然ではないようです。
歴史的に、HFS Plus (Mac OS X ネイティブ ファイルシステム、おそらく iOS でも使用されている) は、各タイムスタンプを 1904 年 1 月 1 日 GMT の午前 0 時からの秒数を表す 32 ビットの符号なし整数に格納していました。(テクニカル ノート TN1150を参照してください。) おそらくある時点でタイムスタンプを 64 ビットに拡張しました (または、32 ビットのタイムスタンプが循環する 2040 年より前に拡張する予定です) が、小数ビットを追加しなかったようです。