将数据转换为日期
Convert DATA to Date
我正在尝试使用 NSFileManager 获取文件的最后使用日期,我正在获取 NSData 格式的日期,但我不确定如何将数据转换为日期。
我从 NSFileManager 得到的值低于
key : "com.apple.lastuseddate#PS"
value : <b9b6c35e 00000000 abd73225 00000000>
请告诉我如何将以上数据值转换为日期。
我使用下面的函数将数据转换为日期,但我得到的值完全错误。
func dataToDate(data:Data) -> Date{
let components = NSDateComponents()
let bytes = [uint8](data)
components.year = Int(bytes[0] | bytes[1] << 8)
components.month = Int(bytes[2])
components.day = Int(bytes[3])
components.hour = Int(bytes[4])
components.minute = Int(bytes[5])
components.second = Int(bytes[6])
let calendar = NSCalendar.current
return calendar.date(from: components as DateComponents)!
}
编辑:
@Martin R,下面是我用来获取数据的代码。
var attributes:[FileAttributeKey : Any]?
do{
attributes = try FileManager.default.attributesOfItem(atPath: url.path)
}catch{
print("Issue getting attributes of file")
}
if let extendedAttr = attributes![FileAttributeKey(rawValue: "NSFileExtendedAttributes")] as? [String : Any]{
let data = extendedAttr["com.apple.lastuseddate#PS"] as? Data
}
可以在 Apple 开发者论坛的 Data to different types ? 中找到必要的信息。
首先请注意,依赖未记录的扩展属性是不安全的。获得相同结果的更好方法是从 NSMetadataItem
:
中检索 NSMetadataItemLastUsedDateKey
if let date = NSMetadataItem(url: url)?.value(forAttribute: NSMetadataItemLastUsedDateKey) as? Date {
print(date)
}
但要回答您的实际问题:该扩展属性包含
UNIX struct timespec
(比较 <time.h>
)值。这是用于 st_atimespec
和 struct stat
的其他成员的类型(这又是用于 fstat()
和类似系统调用的类型)。
您必须将数据复制到 timespec
值中,从 tv_sec
和 tv_nsec
成员计算秒数,然后从秒数创建 Date
自 Unix 时代以来。
func dataToDate(data: Data) -> Date {
var ts = timespec()
precondition(data.count >= MemoryLayout.size(ofValue: ts))
_ = withUnsafeMutableBytes(of: &ts, { lastuseddata.copyBytes(to: [=11=])} )
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
我正在尝试使用 NSFileManager 获取文件的最后使用日期,我正在获取 NSData 格式的日期,但我不确定如何将数据转换为日期。
我从 NSFileManager 得到的值低于
key : "com.apple.lastuseddate#PS"
value : <b9b6c35e 00000000 abd73225 00000000>
请告诉我如何将以上数据值转换为日期。
我使用下面的函数将数据转换为日期,但我得到的值完全错误。
func dataToDate(data:Data) -> Date{ let components = NSDateComponents() let bytes = [uint8](data) components.year = Int(bytes[0] | bytes[1] << 8) components.month = Int(bytes[2]) components.day = Int(bytes[3]) components.hour = Int(bytes[4]) components.minute = Int(bytes[5]) components.second = Int(bytes[6]) let calendar = NSCalendar.current return calendar.date(from: components as DateComponents)! }
编辑: @Martin R,下面是我用来获取数据的代码。
var attributes:[FileAttributeKey : Any]?
do{
attributes = try FileManager.default.attributesOfItem(atPath: url.path)
}catch{
print("Issue getting attributes of file")
}
if let extendedAttr = attributes![FileAttributeKey(rawValue: "NSFileExtendedAttributes")] as? [String : Any]{
let data = extendedAttr["com.apple.lastuseddate#PS"] as? Data
}
可以在 Apple 开发者论坛的 Data to different types ? 中找到必要的信息。
首先请注意,依赖未记录的扩展属性是不安全的。获得相同结果的更好方法是从 NSMetadataItem
:
NSMetadataItemLastUsedDateKey
if let date = NSMetadataItem(url: url)?.value(forAttribute: NSMetadataItemLastUsedDateKey) as? Date {
print(date)
}
但要回答您的实际问题:该扩展属性包含
UNIX struct timespec
(比较 <time.h>
)值。这是用于 st_atimespec
和 struct stat
的其他成员的类型(这又是用于 fstat()
和类似系统调用的类型)。
您必须将数据复制到 timespec
值中,从 tv_sec
和 tv_nsec
成员计算秒数,然后从秒数创建 Date
自 Unix 时代以来。
func dataToDate(data: Data) -> Date {
var ts = timespec()
precondition(data.count >= MemoryLayout.size(ofValue: ts))
_ = withUnsafeMutableBytes(of: &ts, { lastuseddata.copyBytes(to: [=11=])} )
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