Swift 将数据转换为日期

Swift 将数据转换为日期,swift,macos,nsdate,nsdata,Swift,Macos,Nsdate,Nsdata,我正在尝试使用NSFileManager获取文件的最后使用日期,我正在获取NSData格式的日期,但我不确定如何将数据转换为日期 我从NSFileManager获得的值低于 key : "com.apple.lastuseddate#PS" value : <b9b6c35e 00000000 abd73225 00000000> 必要的信息可以在Apple开发者论坛中找到 首先请注意,依赖未记录的扩展属性是不安全的。获得相同结果的更好方法是从NSMetadataItem中检索ns

我正在尝试使用NSFileManager获取文件的最后使用日期,我正在获取NSData格式的日期,但我不确定如何将数据转换为日期

我从NSFileManager获得的值低于

key : "com.apple.lastuseddate#PS"
value : <b9b6c35e 00000000 abd73225 00000000>

必要的信息可以在Apple开发者论坛中找到

首先请注意,依赖未记录的扩展属性是不安全的。获得相同结果的更好方法是从
NSMetadataItem
中检索
nsMetadataItemLastUsedDataKey

if let date = NSMetadataItem(url: url)?.value(forAttribute: NSMetadataItemLastUsedDateKey) as? Date {
    print(date)
}
但要回答您的实际问题:扩展属性具有 UNIX
struct timespec
(比较)值。这是用于
st_atimespec
struct stat
的其他成员的类型(这反过来又是用于
fstat()
和类似系统调用的类型)

您必须将数据复制到
timespec
值中,从
tv_sec
tv_nsec
成员计算秒数,然后从Unix时代开始的秒数创建一个
Date

func dataToDate(data: Data) -> Date {
    var ts = timespec()
    precondition(data.count >= MemoryLayout.size(ofValue: ts))
    _ = withUnsafeMutableBytes(of: &ts, { lastuseddata.copyBytes(to: $0)} )
    let seconds = TimeInterval(ts.tv_sec) + TimeInterval(ts.tv_nsec)/TimeInterval(NSEC_PER_SEC)
    return Date(timeIntervalSince1970: seconds)
}
示例(您的数据):


如果数据只有几个字节,您可以打印数据的各个字节吗?通过这种方式,我们可以尝试找出数据的格式。也就是说,您可以始终尝试
NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data)as!日期
。检查文章。基本上,您可以使用
JSONDecder
并将其
dateDecodingStrategy
设置为适当的值。@Sweeper:您可以在
值处看到单个字节:
@MartinR,这是一种非常混乱的写入字节的方式。。。他们为什么要这样分组?我完全认为这是某种地址…@Sweeper:这就是在Objective-C中打印的
NSData
的方式。我假设实际值是NSData,但与Swift的数据相连一个地址应该有8个字节,而不是16个字节。谢谢你的精彩回答。我使用了NSMetadataItem(url:url)?正如你提到的,我可以得到最后使用的日期。
if let date = NSMetadataItem(url: url)?.value(forAttribute: NSMetadataItemLastUsedDateKey) as? Date {
    print(date)
}
func dataToDate(data: Data) -> Date {
    var ts = timespec()
    precondition(data.count >= MemoryLayout.size(ofValue: ts))
    _ = withUnsafeMutableBytes(of: &ts, { lastuseddata.copyBytes(to: $0)} )
    let seconds = TimeInterval(ts.tv_sec) + TimeInterval(ts.tv_nsec)/TimeInterval(NSEC_PER_SEC)
    return Date(timeIntervalSince1970: seconds)
}
let lastuseddata = Data([0xb9, 0xb6, 0xc3, 0x5e, 0x00, 0x00, 0x00, 0x00,
                         0xab, 0xd7, 0x32, 0x25, 0x00, 0x00, 0x00, 0x00])

print(dataToDate(data: lastuseddata))
// 2020-05-19 10:36:41 +0000