iphone - 表示警报一天中时间的正确方法

标签 iphone objective-c cocoa cocoa-touch macos

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

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

例如,我尝试用这种方式来表示上午 8:00

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

但问题是,这意味着格林威治标准时间上午 8 点,而不是本地时区,因此当我将其传递给 NSDateFormatter 时,我最终会得到我所在时区的凌晨 3:00。

基本上我知道我需要使用 NSCalendarNSDateNSTimeInterval 以及也许 NSDateComponents 做一些事情但我似乎无法想出最简单的方法来计算 iOS 本地通知的调度 NSDates。

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

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

最佳答案

For example, I tried this sort of thing to represent 8:00 AM

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

But the problem is that this means 8 AM GMT and not in the local timezone…

不,问题是这意味着 1970 年 1 月 1 日上午 8 点(格林尼治标准时间)。

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

如果您想计算今天上午 8 点的 NSDate,请创建一个 NSCalendar 对象和 ask it when that is 。使用 components:fromDate: 将现在 ([NSDate date]) 转换为日期组件,然后覆盖小时、分钟和秒并转换回来。

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

So I guess what this boils down to is, how do I represent 8:00 AM for example in the system timezone in such a way that NSDateFormatter will correctly format it as a local time?

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

关于iphone - 表示警报一天中时间的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3947765/

相关文章:

xcode - Xcode 4 中的自定义图标存储在哪里?

swift - 退出全屏NSView后恢复菜单栏

ios - Ringly 为 iOS 使用了哪些 API?

ios - 将一个 UIView 拖动到另一个 UIView 的边界上(带有圆角)

objective-c - 双击 Cocoa 时如何自动调整表格列的大小?

ios - 两个标签的对齐及其约束

cocoa - 启动邮件应用程序时 NSWorkspace 抛出错误

iphone - JSONKit 给出解析错误,但 JSONLint.org 表示它是有效的

iphone - 旋转图像层保持中心

objective-c - "Mutating method sent to immutable object"尽管对象是 NSMutableDictionary