【问题标题】:Does File Attribute contain millisecond? Objective-C文件属性是否包含毫秒? Objective-C
【发布时间】:2012-03-21 13:29:39
【问题描述】:

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

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

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

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

【问题讨论】:

  • 为什么需要这种精度?只是问问。
  • 例如,查看在一秒钟内修改的几个文件中的哪一个是最后修改的(例如,根据第 N 个文件内容生成 N-1 个文件)

标签: objective-c nsdate nsdateformatter nsfilemanager file-attributes


【解决方案1】:

这可能取决于您使用的操作系统以及文件所在的文件系统类型。我假设您使用的是 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 原生文件系统,iOS 也可能使用)将每个时间戳存储在一个 32 位无符号整数中,表示自格林威治标准时间 1904 年 1 月 1 日午夜以来的秒数。 (请参阅Technical Note TN1150。)大概在某个时候,他们将时间戳扩展到 64 位(或者将在 2040 年之前这样做,那时 32 位时间戳将环绕),但显然他们没有添加任何小数位。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-25
    • 1970-01-01
    • 2010-10-25
    • 2010-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多