gregorian
属性在SharedCalendar
类中定义,如下所示:static let gregorian: Calendar = {
var calendar = Foundation.Calendar(identifier: .gregorian)
calendar.timeZone = TimeZone.autoupdatingCurrent
return calendar
}()
当我想要在特定时区访问某个日期的一天时,我会调用以下代码:
SharedCalendar.gregorian.dateComponents([ .day ], from: someDate).day!
假设
someDate
是Date(timeIntervalSinceReferenceDate: 512658000.0)
,即2017-03-31 13:00:00 +0000
。当我在温哥华时区启动应用程序时,
SharedCalendar.gregorian.timeZone
属性的值为America/Vancouver (autoupdatingCurrent)
,SharedCalendar.gregorian.dateComponents([.day], from: someDate).day!
的结果为31
,这是正确的。当我将应用程序切换到后台并将时区更改为悉尼并重新启动应用程序时,
SharedCalendar.gregorian.timeZone
属性的值为Australia/Sydney (autoupdatingCurrent)
(这是正确的),但SharedCalendar.gregorian.dateComponents([.day], from: someDate).day!
的结果为31
,这是错误的(应该是1
)。当我将
gregorian
属性的定义更改为var
时:var gregorian: Calendar {
var calendar = Foundation.Calendar(identifier: .gregorian)
calendar.timeZone = TimeZone.autoupdatingCurrent
return calendar
}
一切正常,对于 America/Vancouver (autoupdatingCurrent)
,我得到了 31
,对于 Australia/Sydney (autoupdatingCurrent)
,我得到了 1
。
目前我还不太明白 TimeZone.autoupdatingCurrent
是如何工作的。当设备的时区更改时,SharedCalendar.gregorian.timeZone
反映出设备的时区,但看起来 SharedCalendar.gregorian
仍在使用旧的时区。
有人能解释一下这种行为吗?
SharedCalendar.gregorian.component(.day, from: someDate)
。 - Leo Dabus