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 触发的主要内容,如果未能解决你的问题,请参考以下文章
在 iOS 10 中向 UILocalNotification 添加操作