代码之家  ›  专栏  ›  技术社区  ›  Nimrod

正确表示报警时间的方法

  •  1
  • Nimrod  · 技术社区  · 15 年前

    我正在尝试编写一个程序的一部分代码,该程序允许用户设置一个或多个警报,提醒他们在一天中的特定时间启动应用程序并执行某些操作。

    我基本上理解我需要使用本地通知,但是我很难想出用正确的方式在应用程序设置中表示一天中某个时间的最佳方法。

    例如,我试着用这种方式来表示上午8点

    [NSDate dateWithTimeIntervalSince1970:(8 * 60 * 60)]
    

    但问题是,这意味着格林尼治标准时间上午8点,而不是在本地时区,所以当我将此消息传递给NSDateFormatter时,我将以凌晨3点结束,例如在我的时区。

    基本上我知道我需要做点什么 NSCalendar , NSDate ,和 NSTimeInterval ,也许 NSDateComponents 但我似乎无法想出最简单的方法来计算iOS本地通知的调度nsdate。

    所以我想这可以归结为,如何表示上午8:00,例如在系统时区中,以使NSDateFormatter将其正确格式化为本地时间?

    似乎我应该能搞清楚,但也许只是太晚了。。。。

    1 回复  |  直到 15 年前
        1
  •  2
  •   Peter Hosey    15 年前

    例如,我试着用这种方式来表示上午8点

    [NSDate dateWithTimeIntervalSince1970:(8 * 60 * 60)]
    

    但问题是这意味着格林尼治标准时间早上8点而不是当地时区

    NSDate对象不在任何日历或时区中表示。NSDate对象是历史上的一个瞬间,仅此而已。您需要一个日历对象来将其转换为日历表示形式(例如,年、月、月、日、小时、分钟、秒),或者一个日期格式化程序来将其转换为字符串表示形式(例如,2010-10-15T22:29:27-0700)。

    ask it when that is . 使用 components:fromDate: 现在右转( [NSDate date] )转换为日期组件,然后覆盖小时、分钟和秒并转换回。

    UIDatePicker(例如,您可能应该向用户演示以使他们能够选择报警的日期和时间)将为您提供NSDate;无需对其执行任何类型的转换或操作。如果用户选择让你在实际事件发生之前提前那么长时间报警,那么你可能需要做的最多的事情就是减去一些时间。

    所以我想这可以归结为,如何表示上午8:00,例如在系统时区中,以使NSDateFormatter将其正确格式化为本地时间?

    NSDateFormatter接受NSDate,正如我所说,NSDates不在时区中。如您所见,默认情况下,日期格式化程序将使用用户的时区(尽管文档中没有明确说明)。为了让日期格式化程序使用其他东西,您必须告诉它这样做。