5

2013 年 7 月 8 日编辑:Apple 有一组出色的 WWDC 视频,它们真正帮助我理解了 Objective-C 中的各种日期和时间类,以及如何正确地执行时间计算/操作。

“常见日期和时间挑战的解决方案”(高清视频标清视频幻灯片(PDF))(WWDC 2013)
“执行日历计算”(标清视频幻灯片(PDF))(WWDC 2011)

注意:链接需要免费的 Apple Developer 会员资格。

我正在为朋友的播客编写应用程序。她每周日下午 5 点直播她的节目,我想在我的应用程序中编写一些代码来选择性地安排该时间的本地通知,以便提醒用户下次直播的时间。我将如何获得一个代表“太平洋时间下个星期日下午 5 点”的 NSDate 对象。(显然这必须转换为用户使用的任何时区)

4

1 回答 1

14

首先获取当前星期几:

NSDate *now = [NSDate date];
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];

NSDateComponents *dateComponents = [calendar components:NSCalendarUnitWeekday | NSCalendarUnitHour fromDate:now];
NSInteger weekday = [dateComponents weekday];

Apple 文档将工作日定义为:

工作日单位是数字 1 到 n,其中 n 是一周中的天数。例如,在公历中,n 为 7,星期日由 1 表示。

接下来计算要添加多少天才能到达下个星期日 5 点:

NSDate *nextSunday = nil;
if (weekday == 1 && [dateComponents hour] < 5) {
    // The next Sunday is today
    nextSunday = now;
} else {
    NSInteger daysTillNextSunday = 8 - weekday;
    int secondsInDay = 86400; // 24 * 60 * 60  
    nextSunday = [now dateByAddingTimeInterval:secondsInDay * daysTillNextSunday];
 }

要在 5:00 获得它,您只需将小时和分钟更改nextSunday为 5:00。查看从 [NSDate date] 获取当前日期,但将时间设置为上午 10:00

于 2012-10-10T23:04:52.547 回答