NSCalendar currentCalendar setTimeZone未设置

Mic*_*ael 3 nstimezone nscalendar ios

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

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

日志语句的结果是:

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

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

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

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

和日志产量:

America/New_York(EDT)抵消-14400(日光)

如何为[NSCalendar currentCalendar]设置时区?这种行为违反直觉.

tc.*_*tc. 7

简单回答:+[NSCalendar currentCalendar]没有返回相同的实例.它应该返回您反映当前选择的地区和时区的实例在那个时候+currentCalendar被调用.有三种可能的合理行为:

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

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

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