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 +0000
,Europe/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 给出错误的时间的主要内容,如果未能解决你的问题,请参考以下文章