DateComponents 给出错误的时间
DateComponents giving wrong hour
我正在尝试在我的测试应用程序中实现一个简单的倒数计时器。
我有两个约会对象:
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小时。
我怀疑日光时间与此有关,但我找不到任何可以帮助的东西。
请帮助我做错了什么,因为我在过去几天尝试了很多方法,但似乎没有任何效果
我能够通过使用重现该行为:
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 +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)
我正在尝试在我的测试应用程序中实现一个简单的倒数计时器。
我有两个约会对象:
fromDate
- 这是我通过 Date() 获得的当前时间,例如2021-08-27 11:07:34 +0000toDate
- 是未来的日期,例如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
仅表示自 纪元 .
(在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)