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)。