首页 > 解决方案 > Swift Calendar.current.nextDate timeZone 问题

问题描述

我正在尝试Date为下一个发生的未来时间获取一个对象,其中 UTC 时间的小时为 18。但是我的代码没有按预期工作。我有以下内容:

let dateComponents = DateComponents(timeZone: TimeZone(abbreviation: "GMT"), hour: 18)
let date = Calendar.current.nextDate(after: Date(), matching: dateComponents, matchingPolicy: .nextTime)

print(date)

问题是这会导致2019-02-09 23:00:00 +0000

日期是下一个发生的时间,小时是 18 英寸EST

我本来预计,因为dateComponents时区设置为 UTC,小时设置为 18,所以日期将是2019-02-09 18:00:00 +0000. 此外,更改时区似乎对nextDate找到的没有影响。

为什么 nextDate 函数不尊重dateComponents传递给它的时区设置?

标签: swiftdatecalendartimezone

解决方案


看起来 DateComponents 中的时区被忽略了。但是,当您在新日历中设置时区时,您会得到正确的结果。

let dateComponents = DateComponents(hour: 18)
var calendar = Calendar(identifier: .gregorian)
calendar.timeZone = TimeZone(secondsFromGMT: 0)!

let date = calendar.nextDate(after: Date(), matching: dateComponents, matchingPolicy: .nextTime)

print(date) // Optional(2020-09-29 18:00:00 +0000)

推荐阅读