Swift 以纳秒为单位的日期差异不起作用

Swift date difference in nanoseconds is not working

我正在实现一个计时器,它需要计算用户处于非活动状态的毫秒数并计算差值并恢复计时器。由于 dateComponents 中没有毫秒选项,我使用纳秒代替,但是,当我尝试计算两个日期之间的纳秒间隔时,我每次都会得到相同的结果(当前日期正在改变,应该得到不同的结果),如果我改变纳秒到秒,它有效。我执行了两次来做实验。

let d1 = Date()
let df = DateFormatter()
df.dateFormat = "y-MM-dd H:m:ss.SSSS"
let d2 = df.date(from: "2021-05-03 9:30:00.1234")!

print(df.string(from: d1)) 
print(df.string(from: d2)) 
print(Calendar.current.dateComponents([.second], from: d1, to: d2).second!) 
// result1: "85573"
// result2: "85067"

当我使用纳秒时

let d1 = Date()
let df = DateFormatter()
df.dateFormat = "y-MM-dd H:m:ss.SSSS"
let d2 = df.date(from: "2021-05-03 9:30:00.1234")!

print(df.string(from: d1))
print(df.string(from: d2))
print(Calendar.current.dateComponents([.nanosecond], from: d1, to: d2).nanosecond!)
// result1: "2147483647"
// result2: "2147483647"

虽然我找不到它的文档:似乎所有日期组件的可能值都限于带符号的 32 位整数,超出该范围的值被截断为 Int32.max = 2147483647 Int32.min = -2147483648:

let d1 = Date()
let d2 = d1.addingTimeInterval(2)
print(Calendar.current.dateComponents([.nanosecond], from: d1, to: d2).nanosecond!)
// 2000000000
let d3 = d1.addingTimeInterval(3)
print(Calendar.current.dateComponents([.nanosecond], from: d1, to: d3).nanosecond!)
// 2147483647
let d4 = d1.addingTimeInterval(-3)
print(Calendar.current.dateComponents([.nanosecond], from: d1, to: d4).nanosecond!)
// -2147483648

如果您同时请求秒和纳秒,则纳秒组件仅保留小数秒,这会使您的代码再次产生正确的结果:

print(Calendar.current.dateComponents([.second, .nanosecond], from: d1, to: d2))
// Example output:
// second: 111403 nanosecond: 464950927 isLeapMonth: false

如果你只是需要两个时间点之间的毫秒差值,那么

let elapsed = Int(d2.timeIntervalSince(d1) * 1000)

是一个更简单的选项。

不需要所有日期组件的东西。只需在每个日期上使用 timeIntervalSinceReferenceDate 从另一个日期中减去一个日期。或者:

https://developer.apple.com/documentation/foundation/date/3329238-distance

结果以秒为单位,精确到毫秒,因此乘以 1000 就完成了。