NSCalendar currentCalendar setTimeZone未设置

时间:2012-10-09 00:00:48

标签: ios nscalendar nstimezone

如果我尝试使用以下内容从应用内的任何位置任意设置时区:

[[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]的时区?这种行为违反直觉。

1 个答案:

答案 0 :(得分:7)

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

  • 每次都会返回一个新值。
  • 除非检测到返回新值,否则返回缓存值。
  • 它返回一个缓存值,当它注意到区域设置/日历更改时清除它。

修改日历只在第一种情况下才有意义。 (在第二种情况下,先前对+currentCalendar的调用将指向同一实例。在第三种情况下,对+currentCalendar的所有调用将返回相同的实例,直到用户更改区域设置/时区。)< / p>

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