检测[NSTimeZone localTimezone] secondsFromGMT属性更改

时间:2014-01-23 15:34:24

标签: ios nscalendar nstimezone

在我们的应用程序中,我们使用NSCalendar来处理NSDate对象,例如获取日期组件。

这个NSCalendar实例是一个单例对象,因为我们在很短的时间内完成了大量的日期计算,我们注意到每次需要时用[[NSCalendar alloc] initWith ...]创建新实例都耗费太多时间。

问题是,如果在整个应用程序执行期间保留NSCalendar实例,则此实例会保持timezone属性不变,即使时区已更改。

所以,问题在于我们想要检测时区的变化并通过以下两种方式正确反应:

self.singletonCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]

self.singletonCalendar.timezone = [NSTimezone localTimezone];

我们正在讨论的可能解决方案:

  1. 每次应用程序变为活动状态时更新时区属性。
  2. 使用KVO检测时区更改(尝试此操作但未成功)。
  3. 谢谢, 尼古拉斯。


    Putz1103实施了提议的解决方案:

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(significantTimeChangeNotification) name:UIApplicationSignificantTimeChangeNotification object:nil];
    
    - (void)significantTimeChangeNotification
    {
        NSTimeZone *localTimezone = [NSTimeZone localTimeZone];
        [KIDateUtils setCalendarTimezone:localTimezone];
    }
    

2 个答案:

答案 0 :(得分:2)

我会做两个选项的混搭。我会在app start(或进入前台)上更新它。但是,当应用程序当前处于前台时,您可以设置一个监听器来进行时间更改,例如answer here

"UIApplicationDelegate" has a method called "applicationSignificantTimeChange:" that gets called when there is a significant change in the time.

答案 1 :(得分:2)

让您的单身人士注册UIApplicationSignificantTimeChangeNotification通知。收到此消息后,请更新单例中的NSCalendar实例。