具有非默认时区的 UILocalNotification

Posted

技术标签:

【中文标题】具有非默认时区的 UILocalNotification【英文标题】:UILocalNotification with non default timezone 【发布时间】:2011-02-06 14:15:58 【问题描述】:

我一直在尝试使用 UILocalNotification 并将时区设置为我的默认时区以外的其他时区。

目的是做类似的事情: -用户将安排带有时间和时区的警报 - 当该时区变为指定时间时显示警报。

在更口头的描述中,假设我住在洛杉矶,我的女朋友在芝加哥。我想在工作日的芝加哥早上 7 点设置提醒。

对于一个警报,我可以不用时区来做绝对时间。但我想允许用户设置重复标志,在这种情况下我似乎不能这样做 - 我尝试将 localnotification 的 timezone 属性设置为芝加哥,如上面的示例,但是本地通知不会触发。

我在序列化过程中记录了 uinocalnotification,这是一个输出:

"<UIConcreteLocalNotification: 0xfb25a50>fire date = 2011-02-06 06:02:00 -0800, time zone = America/Chicago (CST) offset -21600, repeat interval = 16, next fire date = 2011-02-06 08:02:00 -0800"

我将 firedate 设置为芝加哥绝对时间上午 9:02,并将时区设置为 cst - 日志确实提到火灾日期确实是我当地时间 06:02。然而,什么也没有发生。此外,下一个开火日期很奇怪,因为它应该是 +1 天,而不是 +2 小时。

我是这样设置的: 类 classUILocalNotification = NSClassFromString(@"UILocalNotification");

if (classUILocalNotification != nil) 
    id note = [[classUILocalNotification alloc] init];

    NSString *body = @"body message";       
    switch (repeatflag) 
        case 1: [note setRepeatInterval:NSDayCalendarUnit]; break;
        case 2: [note setRepeatInterval:NSWeekdayCalendarUnit]; break;
        case 3: [note setRepeatInterval:NSWeekCalendarUnit]; break;
        case 4: [note setRepeatInterval:NSMonthCalendarUnit]; break;
        case 5: [note setRepeatInterval:NSYearCalendarUnit]; break; 
        default: break;
    
    [note setFireDate:dt];
    [note setAlertBody:body];
    [note setTimeZone:timezone];                
    [note setHasAction:NO];

这似乎是一些未知的行为。任何人都有更好的方法来实现我想要做的事情? 谢谢!

【问题讨论】:

发布更多代码,以便我们检查确切的问题! 嗨 kongofbliss,感谢您的回复。当您将 UILocalNotification (UILN) 设置为使用当前 tz 以外的任何内容触发时,它似乎存在问题。我还没有弄清楚到底是什么,但是当 tz 不是当前 tz 时,触发日期似乎在我的测试中混淆了(ios4.0.2)。为了解决这个问题,我只需要在没有设置时区信息的情况下安排 uilocalnotification。因此,日期被解释为绝对日期,并正确触发。顺便说一句,对于任何尝试这样做的人,当您卸载应用程序并重新安装应用程序时,ios4.0 存在错误 - 以前安装的 UILN 设置将显示在新应用程序中。 【参考方案1】:

使用非本地时区时,UILocalNotification 似乎存在错误。触发的第一个事件是针对正确的日期和时间以及时区触发的。但是,后续事件会在本地时区中的给定日期和时间触发,而不是在 setTimeZone 方法中设置的事件。 [iOS 6.1]

【讨论】:

以上是关于具有非默认时区的 UILocalNotification的主要内容,如果未能解决你的问题,请参考以下文章

ES实战初探ES date类型的时区机制

date_default_timezone_get() — 取得一个脚本中所有日期时间函数所使用的默认时区

为啥显式允许默认构造函数和具有 2 个或更多(非默认)参数的构造函数?

Delphi - 获取非本地时区的 TTimeZone 并在时区之间转换 [重复]

BigQuery 中的优雅时区转换

在 PostgreSQL timestamptz 类型中保留时区