用户时区问题
User timezone issues
在今天早上更改时钟之前,我的应用程序运行良好。我使用以下代码设置用户的时区。
let usersTimeZone: String = ltzAbbrev()
var gregorian: NSCalendar = NSCalendar(calendarIdentifier: NSISO8601Calendar)!
gregorian.timeZone = NSTimeZone(abbreviation: usersTimeZone)!
上面的代码一直有效,直到今天早上时钟向前,现在 ltzAbbrev()
返回 GMT+1
,这导致我的程序崩溃并出现标准错误
fatal error: unexpectedly found nil while unwrapping an Optional value
看来你正在使用函数
func ltzAbbrev() -> String { return NSTimeZone.localTimeZone().abbreviation! }
来自 。所以
let usersTimeZone:String = ltzAbbrev()
gregorian.timeZone = NSTimeZone(abbreviation: usersTimeZone)!
您正在进行两次转换
time zone -> abbreviation -> time zone
如 NSTimeZone
中所述,这不能可靠地工作
文档:
In general, you are discouraged from using abbreviations except for
unique instances such as “UTC” or “GMT”. Time Zone abbreviations are
not standardized and so a given abbreviation may have multiple
meanings—for example, “EST” refers to Eastern Time in both the United
States and Australia
也没有必要,因为你可以简单地设置
gregorian.timeZone = NSTimeZone.localTimeZone()
相反。
另一个(不相关的)问题可能是NSISO8601Calendar
的用法,
正如 NSLocale
文档所述
Identifier for the ISO8601. The ISO8601 calendar is not yet implemented.
公历是用
获得的
let gregorian = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!
在今天早上更改时钟之前,我的应用程序运行良好。我使用以下代码设置用户的时区。
let usersTimeZone: String = ltzAbbrev()
var gregorian: NSCalendar = NSCalendar(calendarIdentifier: NSISO8601Calendar)!
gregorian.timeZone = NSTimeZone(abbreviation: usersTimeZone)!
上面的代码一直有效,直到今天早上时钟向前,现在 ltzAbbrev()
返回 GMT+1
,这导致我的程序崩溃并出现标准错误
fatal error: unexpectedly found nil while unwrapping an Optional value
看来你正在使用函数
func ltzAbbrev() -> String { return NSTimeZone.localTimeZone().abbreviation! }
来自 。所以
let usersTimeZone:String = ltzAbbrev()
gregorian.timeZone = NSTimeZone(abbreviation: usersTimeZone)!
您正在进行两次转换
time zone -> abbreviation -> time zone
如 NSTimeZone
中所述,这不能可靠地工作
文档:
In general, you are discouraged from using abbreviations except for unique instances such as “UTC” or “GMT”. Time Zone abbreviations are not standardized and so a given abbreviation may have multiple meanings—for example, “EST” refers to Eastern Time in both the United States and Australia
也没有必要,因为你可以简单地设置
gregorian.timeZone = NSTimeZone.localTimeZone()
相反。
另一个(不相关的)问题可能是NSISO8601Calendar
的用法,
正如 NSLocale
文档所述
Identifier for the ISO8601. The ISO8601 calendar is not yet implemented.
公历是用
获得的let gregorian = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!