DateComponents 给出错误的时间

Posted

技术标签:

【中文标题】DateComponents 给出错误的时间【英文标题】:DateComponents giving wrong hour 【发布时间】:2021-10-27 08:06:14 【问题描述】:

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

我有两个约会:

    fromDate - 这是我通过 Date() 得到的当前时间,例如2021-08-27 11:07:34 +0000 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 小时。

我怀疑白天时间与此有关,但我在这里找不到任何可以帮助的东西。

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

【问题讨论】:

夏令时不应该与此有关吗? 你在哪里?我的意思是你的语言环境是什么?你在夏天/冬天“改变时间”吗?您能否检查这两个日期之间是否有一个(快速的 Google 搜索应该会给您答案)。是这样吗? 是的,夏令时对我有影响。但在这种情况下,这是否意味着小时数应该是 13 而不是 12? 两个日期都是 UTC(仅供参考) 不,它们不是,它们只是使用该时区打印的。 Date 对象不包含任何时区。 【参考方案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 仅表示自纪元以来的时间瞬间/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)

【讨论】:

以上是关于DateComponents 给出错误的时间的主要内容,如果未能解决你的问题,请参考以下文章

Swift DateComponents 包含错误的小时值

swift DateComponents

swift DateComponents

swift DateComponents

swift DateComponents

从 String 创建 DateComponents / NSDateComponents,反之亦然