UILocalNotification - 在每个时区的早上 6:00 触发

Posted

技术标签:

【中文标题】UILocalNotification - 在每个时区的早上 6:00 触发【英文标题】:UILocalNotification - Fire at 6:00am in every time zone 【发布时间】:2013-12-06 03:07:20 【问题描述】:

我无法理解时区,而且似乎无法解决。

用户应输入闹钟响起的时间。所以他们在澳大利亚悉尼的时区选择周日早上 6:00(使用 pickerView)。

然后,当他们的设备将时区更改为美国洛杉矶时,闹钟仍应在洛杉矶时间早上 6:00 响起(现在是悉尼时间凌晨 1:00 左右)。

设置通知:

UILocalNotification *localNotification;
[localNotification setTimeZone:[NSTimeZone localTimeZone]];

读取通知以显示在 TableView 中:

NSDate *fd = <the firedate of the scheduled notification>
NSDateFormatter* df_local = [[[NSDateFormatter alloc] init] autorelease];
//[df_local setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"GMT"]];
[df_local setTimeZone:[NSTimeZone localTimeZone]];
[df_local setDateFormat:@"hh:mm"];
NSString* ts_local_string = [df_local stringFromDate:fd];

使用该代码,我将悉尼的时间设置为上午 6:00,但在洛杉矶查看时,时间现在是下午 1:00。

在设置 UILocalNotification 时我应该将时区设置为什么,在阅读通知时我应该将时区设置为什么,以便在悉尼和洛杉矶查看时都是当地时间上午 6:00。

谢谢

【问题讨论】:

"timeZone - fireDate中指定的日期根据该属性的值进行解释。如果指定nil(默认),则fire date被解释为绝对GMT时间,适用于倒数计时器等情况。如果您将有效的 NSTimeZone 对象分配给此属性,则触发日期将被解释为挂钟时间,当时区发生变化时会自动调整;适合这种情况的示例是警报时钟。” (这是您应该“捏造” NSDate 时区的罕见情况之一 - 使用设置为 GMT 的格式化程序设置它,以便 NSDate 反映本地时间与 GMT。) 所以你是说我应该捏造显示的时间?我做了一些测试,通知在正确的时间触发(即每个时区当地时间上午 6:00),只是它使用 dateFormatter 显示错误的时间 因为您没有将 dateFormatter 设置为 GMT。 将 dateFormatter 设置为 GMT 仍然会在切换时区时更改显示的时间。这与实际触发通知的时间不准确(相对于当时用户的时区) 【参考方案1】:

我想我已经弄明白了。

UILocalNotification *localNotification;
[localNotification setTimeZone:[NSTimeZone localTimeZone]];
    [localNotification setFireDate:fireDate];

这将使 fireDate 中的任何日期成为通知将在用户当前时区中发出的时间/日期。所以它会在悉尼早上 6:00 起飞,然后在洛杉矶早上 6:00 再次起飞,等等。

所以这部分按预期工作,我犯的错误是显示时间。

我需要将 NSDateFormatter 的时区设置为 UILocalNotification 的时区,而不是我的问题中的代码:

UILocalNotification *myLN = <The UILocalNotification we've retrieved from somewhere>;
NSDateFormatter* df_local = [[[NSDateFormatter alloc] init] autorelease];
[df_local setTimeZone:myLN.timeZone];
[df_local setDateFormat:@"hh:mm"];
NSString* ts_local_string = [df_local stringFromDate:fd];

【讨论】:

以上是关于UILocalNotification - 在每个时区的早上 6:00 触发的主要内容,如果未能解决你的问题,请参考以下文章

UILocalNotification 每周重复一次

UILocalNotification 重复

UILocalNotification 最大差异

在 iOS 10 中向 UILocalNotification 添加操作

将 UILocalNotification 同步到 Watch

如何在 Swift 中使用 UILocalNotification