swift - 将 DAAppearanceTime 转换为日期

标签 swift date-conversion diskarbitration

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

我尝试了以下方法:

  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

最佳答案

“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()返回,这就是

Absolute time is measured in seconds relative to the absolute reference date of Jan 1 2001 00:00:00 GMT.

您将它转换为 Date,如下所示:

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

对于值 511348742.912949 这导致 日期 2017-03-16 09:19:02 +0000

关于swift - 将 DAAppearanceTime 转换为日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42830609/

相关文章:

python - 如何将超出范围的纪元转换为日期时间python?

objective-c - DADiskEject 导致问题,错误代码为 12 (kDAReturnUnsupported)

swift - 如何在 Swift 中打印调用堆栈?

swift - 如何使用 Swift 将 Parse 安装 objectId(或 devicetoken)保存为 cookie

java - 如何在Java中将日期转换为UTC?

java - Flex Java BlazeDS 日期差异

usb-drive - 将 USB 磁盘 BSD 名称映射到 OSX 中实际安装的驱动器

ios - 自定义 UIButton isSelected 背景颜色未按预期工作(IOS/Swift)

ios - Swift 在 Optional() 中获取值(value)