如果我尝试使用以下内容从应用内的任何位置任意设置时区:
[[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]的时区?这种行为违反直觉。
答案 0 :(得分:7)
简单回答:+[NSCalendar currentCalendar]
没有返回相同的实例。它应该在+currentCalendar
被调用时返回一个反映当前所选语言环境和时区的实例。有三种可能的合理行为:
修改日历只在第一种情况下才有意义。 (在第二种情况下,先前对+currentCalendar
的调用将指向同一实例。在第三种情况下,对+currentCalendar
的所有调用将返回相同的实例,直到用户更改区域设置/时区。)< / p>
设置应用时区的正确方法是+[NSTimeZone setDefaultTimeZone:]
。