gpt4 book ai didi

objective-c - 文件属性是否包含毫秒? Objective-C

转载 作者:行者123 更新时间:2023-12-04 03:06:45 28 4
gpt4 key购买 nike

我想从文件属性的创建时间获取毫秒数 当我获取文件属性时,我使用 NSDateFormatter 将文件创建时间 (NSDate) 转换为 NSString。

[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss:SS: A"];
  • ss --> 秒
  • SS --> 应该是毫秒
  • A --> 日期的毫秒数

我得到 SS 的 00 和 A 的 54487000。我注意到 NSDate 的最后三位数字始终为零,来自任何文件的文件属性。但是,当我对来自 [NSDate date] 的 NSDate 使用相同的格式化程序时,A 的最后三位数字不为零,SS 数字也不总是零。

在 Objective-C 中检索到的文件属性是否包含文件属性?

最佳答案

这可能取决于您使用的操作系统以及文件所在的文件系统类型。我假设您使用的是 iOS(在这种情况下,您使用的是 iOS 碰巧使用的任何文件系统)。

stat 系统调用返回有关文件的信息,包括几个时间戳,在名为 struct stat 的结构中。该结构将每个时间戳存储为 struct timespecstruct timespec 包含一个秒字段 tv_sec 和一个纳秒字段 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 native 文件系统,可能也被 iOS 使用)将每个时间戳存储在一个 32 位无符号整数中,表示自格林威治标准时间 1904 年 1 月 1 日午夜以来的秒数。 (参见 Technical Note TN1150。)大概在某个时候他们将时间戳扩展到 64 位(或者将在 2040 年之前这样做,届时 32 位时间戳将回绕),但显然他们没有添加任何小数位。

关于objective-c - 文件属性是否包含毫秒? Objective-C ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9543563/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com