DateComponents 给出错误的时间

DateComponents giving wrong hour

我正在尝试在我的测试应用程序中实现一个简单的倒数计时器。

我有两个约会对象:

  1. fromDate - 这是我通过 Date() 获得的当前时间,例如2021-08-27 11:07:34 +0000
  2. toDate - 是未来的日期,例如2021-11-17 01:00:00 +0000

我正在使用 DateComponents 取回天数、小时数、分钟数和秒数的差异。

let components = Calendar.current.dateComponents([.day, .hour, .minute, .second],
                                                 from: fromDate,
                                                 to: toDate)

它返回我的天时分秒 81、12、52、25 的值

日、分、秒的值正确,但小时少了1小时。

我怀疑日光时间与此有关,但我找不到任何可以帮助的东西。

请帮助我做错了什么,因为我在过去几天尝试了很多方法,但似乎没有任何效果

我能够通过使用重现该行为:

let from = Date(timeIntervalSince1970: 1630062455)
print(from) // 2021-08-27 11:07:35 +0000
let to = Date(timeIntervalSince1970: 1637110800)
print(to) // 2021-11-17 01:00:00 +0000
var calendar = Calendar(identifier: .gregorian)
calendar.timeZone = TimeZone(identifier: "Europe/London")!
let comp = calendar.dateComponents([.day, .hour, .minute, .second], from: from, to: to)
print(comp.day!, comp.hour!, comp.minute!, comp.second!)

发生这种情况的原因是因为在执行 dateComponents(_:from:to:) 时,Calendar 考虑到了它的时区。毕竟,如果没有时区,(几乎)没有日期组件是有意义的——例如,您将无法分辨 Date 是几小时。 Date 仅表示自 纪元 .

以来 time/n 秒内的一个瞬间

(在Calendar.current的情况下,它使用的时区是TimeZone.current

Europe/London would go out of DST at some point between from and to。这意味着日历将计算日期组件之间的差异:

from: 2021-08-27 12:07:35
to:   2021-11-17 01:00:00

注意第一次是12:07:35,而不是11:07:35。这是因为在 2021-08-27 11:07:35 +0000Europe/London 的本地日期时间实际上是 2021-08-27 12:07:35

要获得所需的输出,只需将日历的 timeZone 更改为 UTC:

var calendar = Calendar.current
calendar.timeZone = TimeZone(identifier: "UTC")!
let comp = calendar.dateComponents([.day, .hour, .minute, .second], from: from, to: to)