这可能取决于您使用的操作系统以及文件所在的文件系统类型。我假设您使用的是 iOS(在这种情况下,您使用的是 iOS 碰巧使用的任何文件系统)。
系统调用以stat
一个名为struct stat
. 该结构将每个时间戳存储为struct timespec
. struct timespec
包含一个 seconds 字段和tv_sec
一个 nanoseconds 字段tv_nsec
。因此,理论上,您可以获得文件的纳秒分辨率时间戳。
在实践中,您似乎只能获得秒分辨率的时间戳。我用这段代码测试过:
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}
}
您可以看到所有tv_nsec
字段均为 0。这似乎不太可能是巧合。
从历史上看,HFS Plus(Mac OS X 原生文件系统,iOS 也可能使用)将每个时间戳存储在一个 32 位无符号整数中,表示自格林威治标准时间 1904 年 1 月 1 日午夜以来的秒数。(请参阅技术说明 TN1150。)大概在某个时候,他们将时间戳扩展到 64 位(或者将在 2040 年之前这样做,那时 32 位时间戳将环绕),但显然他们没有添加任何小数位。