在 Swift 中获取 Unix 时代时间

你怎么在 Swift 里得到时代的秒数?

84667 次浏览

您可以简单地使用 NSDate 的 timeIntervalSince1970函数。

let timeInterval = NSDate().timeIntervalSince1970

为了 Swift 3.0

Date().timeIntervalSince1970

1秒 = 1000毫秒
1秒 = 1,000,000微秒

Swift 的 timeIntervalSince1970以“亚毫秒”精度返回秒,我观察到这通常意味着微秒,但有时一个比例(小数点右边的一个数字)小于或多于这个精度。当它返回5(小数后面的5位数)时,我假设 Swift 不能产生6个尺度的精度,当它返回7的尺度时,额外的数字可以被截断,因为它超过了微秒精度。因此:

let secondPrecision = Int(Date().timeIntervalSince1970) // definitely precise
let millisecondPrecision = Int(Date().timeIntervalSince1970 * 1_000) // definitely precise
let microsecondPrecision = Int(Date().timeIntervalSince1970 * 1_000_000) // most-likely precise

也就是说,毫秒精度是真正的 Unix 时间戳,我认为每个人都应该使用它。如果你使用的是一个 API 或者一个使用 Unix 时间戳的框架,它很可能是毫秒级精确的。因此,对于 Swift 中真正的 Unix 时间戳:

typealias UnixTimestamp = Int


extension Date {
/// Date to Unix timestamp.
var unixTimestamp: UnixTimestamp {
return UnixTimestamp(self.timeIntervalSince1970 * 1_000) // millisecond precision
}
}


extension UnixTimestamp {
/// Unix timestamp to date.
var date: Date {
return Date(timeIntervalSince1970: TimeInterval(self / 1_000)) // must take a millisecond-precise Unix timestamp
}
}


let unixTimestamp = Date().unixTimestamp
let date = unixTimestamp.date

请注意,在2038年,32位的数字将不能用于 Unix 时间戳,它们必须是64位的,但是 Swift 会自动为我们处理,这样我们就可以安全地使用 Int(并且不需要显式地使用 Int64)。

您可以使用以下方法获得它

Int(Date().timeIntervalSince1970)

如果您希望获取给定日期,则这是针对当前日期的

Int(myDate.timeIntervalSince1970)

如果要从 UNIX 时间纪元转换回 Swift Date 时间,可以使用以下命令

let date = Date(timeIntervalSince1970: unixtEpochTime)

如果你不想导入 Foundation,比如 Linux 等,你可以使用 CoreFoundation 的以下内容:

import CoreFoundation


let timestamp = CFAbsoluteTimeGetCurrent() + kCFAbsoluteTimeIntervalSince1970