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

问题描述 投票:2回答:1

我想从文件属性的创建时间获得毫秒当我获得文件属性时,我使用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中检索的文件属性是否包含文件属性?

objective-c nsdate nsdateformatter nsfilemanager file-attributes
1个回答
3
投票

这可能取决于您所使用的操作系统以及该文件所属的文件系统类型。我假设你在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位时间戳将会回转时这样做),但显然他们没有添加任何小数位。

© www.soinside.com 2019 - 2024. All rights reserved.