Swift4 - 强制解包使用TimeZone.current.abbreviation()返回的缩写是否安全?

时间:2018-03-29 05:25:36

标签: swift timezone swift4

我一直在寻找一种方法将本地时区保存到属性中,以便稍后我需要在UI中显示格式化日期时使用它来格式化日期。

我发现TimeZone.current.abbreviation()可以为我返回缩写,我可以使用该缩写来格式化日期,但我注意到它返回String?而不是String

我已经检查了official document,但没有发现该API返回可选字符串或可能是失败案例的原因。

我目前存储时区的解决方案是let timeZone = TimeZone.current.abbreviation()!,但我不确定强行打开它是否安全。有谁知道强制解包返回的缩写是否安全,或者为什么API返回一个可选值?感谢。

1 个答案:

答案 0 :(得分:0)

虽然没有记录,但我想说必须有一个返回值是可选的原因。所以它失败有时只需检查可选项:

if let abbr = TimeZone.current.abbreviation() {
    // use abbreviation
} else {
    // fall back on something else
}

无论如何,几乎每个选项都应该这样做。

我认为这里更重要的是你决定如何设定日期格式。根据你的措辞,我怀疑你没有使用DateFormatter(否则你不需要存储缩写)。

使用DateFormatter

只需存储TimeZone.current(整个TimeZone对象)并将其分配给dateFormatter.timeZone。格式化程序将为您解决所有问题。您可以使用yyyy/MM/dd/ HH:mm:ss zzz

之类的日期格式
let formatter = DateFormatter()
formatter.dateFormat = "yyyy/MM/dd/ HH:mm:ss zzz"
formatter.timeZone = TimeZone(identifier: "Asia/Shanghai")
formatter.string(from: Date())

您似乎也想表明它是否是夏令时。使用isDaylightSavingTime的{​​{1}}方法进行检查。您最后可以添加TimeZone之类的字符串。