正确表示警报时间的方法

时间:2010-10-16 05:18:59

标签: iphone objective-c cocoa cocoa-touch macos

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

我基本上明白我需要使用本地通知,但我很难想出以适当的方式在我的应用程序设置中表示时间的最佳方式。

例如,我尝试过这种事情代表上午8点

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

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

基本上我知道我需要对NSCalendarNSDateNSTimeInterval以及NSDateComponents执行某些操作,但我似乎无法想出最简单的内容接近这个,这将允许我为iOS本地通知计算NSDates的安排。

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

似乎我应该能够解决这个问题,但也许晚上已经太晚了......

1 个答案:

答案 0 :(得分:2)

  

例如,我尝试过这种事情代表上午8点

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

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

不,问题在于这意味着1970年1月1日上午8点GMT。

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

如果要在今天上午8点计算NSDate,请创建一个NSCalendar对象和ask it when that is。立即使用components:fromDate:[NSDate date])进入日期组件,然后覆盖小时,分钟和秒,然后转换回来。

UIDatePicker(例如您可能应该呈现给用户以使他们能够选择其警报的日期和时间)将为您提供NSDate;没有必要对它进行任何形式的转换或操纵。如果用户选择让你在实际事件发生前很长时间响铃,那么你可能需要做的最多就是减去一些时间。

  

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

NSDateFormatter采用NSDate,正如我所说,NSDate不在时区。如您所见,您的日期格式化程序将默认使用用户的时区(尽管文档中未明确说明)。对于日期格式化程序使用其他东西,你必须告诉它这样做。

相关问题