【问题标题】:NSCalendar currentCalendar setTimeZone not settingNSCalendar currentCalendar setTimeZone 未设置
【发布时间】:2012-09-29 06:10:28
【问题描述】:

如果我尝试使用以下命令从应用程序中的任何位置任意设置时区:

[[NSCalendar currentCalendar] setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"EST"]];
NSTimeZone *tz = [[NSCalendar currentCalendar] timeZone];
NSLog(@"%@", tz);

日志语句的结果是:

美国/洛杉矶 (PDT) 偏移 -25200(日光)

(这是我的本地时区,即 [NSTimeZone systemTimeZone])

但是,NSCalendar 上一个类别中功能相似的代码可以正常工作:

[self setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"EST"]];
NSTimeZone *tz = [self timeZone];
NSLog(@"%@", tz);

日志产生:

美国/纽约 (EDT) 偏移 -14400(日光)

为 [NSCalendar currentCalendar] 设置时区是怎么回事?这种行为是违反直觉的。

【问题讨论】:

    标签: ios nscalendar nstimezone


    【解决方案1】:

    简单的答案:+[NSCalendar currentCalendar] 没有返回相同的实例。它应该会在调用+currentCalendar 时返回一个反映当前选择的区域设置和时区的实例。有三种可能的合理行为:

    • 每次都会返回一个新值。
    • 它返回一个缓存值,除非它检测到它应该返回一个新值。
    • 它返回一个缓存值,并在发现语言环境/日历更改时将其清除。

    修改日历只在第一种情况下是明智的。 (在第二种情况下,之前对+currentCalendar 的调用将指向同一个实例。在第三种情况下,所有对+currentCalendar 的调用都将返回同一个实例,直到用户更改区域设置/时区。)

    设置应用时区的正确方法是+[NSTimeZone setDefaultTimeZone:]

    【讨论】:

    • 好的,有道理。似乎该价值正在丢失,因为我认为这种行为就像一个单身人士。相反,该方法每次都返回一个新的日历实例。我可以尝试引用一个不同的 [NSCalendar currentCalendar] 实例并记录时区以验证它是否有效,而不是调用一个新实例。如果我出于任何原因想保留该日历,我可以采用相同的方法。
    • 答案取决于你最终想要通过“设置时区”实现什么。如果您想设置应用程序范围内面向用户的时区,请使用我已经提到的+[NSTimeZone setDefaultTimeZone:](它可能也足以满足 basic 单元测试需求);但这可能会使用户感到困惑!但是,应用程序范围的时区通常是不合适的。 iOS 还支持日本和佛教年份编号;如果您需要格式化/解析 ISO 8601 日期(例如 iCalendar 解析器),请使用 [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] 然后设置其时区。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-04
    • 2015-01-25
    • 2013-05-28
    • 1970-01-01
    相关资源
    最近更新 更多