用户时区问题

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)!