1

如何将磁盘仲裁中的DAAppearance Time转换为有效的时间戳?

我尝试了以下方法:

  if let appearanceTime = diskinfo["DAAppearanceTime"] as? NSNumber{
                            print(appearanceTime)
                            let date = NSDate(timeIntervalSince1970: TimeInterval(appearanceTime))
                            print(date)                             
                        }

我从函数中得到正确的DAAppearanceTime但转换后的年份错误:

511348742.912949

1986-03-16 09:19:02 +0000

4

1 回答 1

2

"DAAppearanceTime"密钥没有正式记录,但 DiskArbitration 框架是开源的。

DAInternal.c:

 const CFStringRef kDADiskDescriptionAppearanceTimeKey  = CFSTR( "DAAppearanceTime"  );

DADisk.c:

/*
 * Create the disk description -- appearance time.
 */

time = CFAbsoluteTimeGetCurrent( );

object = CFNumberCreate( allocator, kCFNumberDoubleType, &time );
if ( object == NULL )  goto DADiskCreateFromIOMediaErr;

CFDictionarySetValue( disk->_description, kDADiskDescriptionAppearanceTimeKey, object );
CFRelease( object );

所以那个键的值就是CFAbsoluteTimeGetCurrent()返回的值,那就是

绝对时间以相对于绝对参考日期 2001 年 1 月 1 日 00:00:00 GMT 的秒数为单位测量。

你把它转换成Date这样的:

if let time = diskinfo["DAAppearanceTime"] as? Double {
    let date = Date(timeIntervalSinceReferenceDate: time)
    print(date)
}

对于值511348742.912949,这将导致 date 2017-03-16 09:19:02 +0000

于 2017-03-16T11:00:51.523 回答