3

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

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

日志语句的结果是:

America/Los_Angeles (PDT) 偏移量 -25200(日光)

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

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

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

日志产生:

America/New_York (EDT) 偏移量 -14400(日光)

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

4

1 回答 1

7

简单的答案:+[NSCalendar currentCalendar]没有返回相同的实例。它应该为您返回一个实例,该实例反映了调用+currentCalendar当前选择的语言环境和时区。有三种可能的合理行为:

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

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

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

于 2012-10-09T02:13:01.740 回答