检测 [NSTimeZone localTimezone] secondsFromGMT 属性变化

Posted

技术标签:

【中文标题】检测 [NSTimeZone localTimezone] secondsFromGMT 属性变化【英文标题】:Detect [NSTimeZone localTimezone] secondsFromGMT property change 【发布时间】:2014-01-23 15:34:24 【问题描述】:

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

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

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

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

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

self.singletonCalendar.timezone = [NSTimezone localTimezone];

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

    每次应用程序激活时更新时区属性。 使用 KVO 检测时区变化(尝试过,但没有成功)。

谢谢, 尼古拉斯。


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

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(significantTimeChangeNotification) name:UIApplicationSignificantTimeChangeNotification object:nil];

- (void)significantTimeChangeNotification

    NSTimeZone *localTimezone = [NSTimeZone localTimeZone];
    [KIDateUtils setCalendarTimezone:localTimezone];

【问题讨论】:

在您的更新中,您发布了一个归功于 Putz1103 的建议解决方案,但这是 rmaddy 给出的答案。 Putz1103建议使用UIApplicaitonDelegate方法applicationSignificantTimeChange: 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于检测 [NSTimeZone localTimezone] secondsFromGMT 属性变化的主要内容,如果未能解决你的问题,请参考以下文章

UILocalNotification 和 NSTimeZone,出现错误的时区

是否可以从 CLLocation(或 CLLocationCoordinates2D)获取 NSTimeZone 实例?

如何使用 NSTimeZone -timeZoneWithName: 与 Rails ActiveSupport 中的城市名称?

如何从 NSTimeZone 获取 GNU Lib C TZ 格式输出?

iOS NSDate,NSDateFormatter,NSTimeZone,NSTimeInterval

NSDate 转换 NSDateComponents 问题