以编程方式将日期“下周日下午5点”

时间:2012-10-10 22:55:15

标签: objective-c ios nsdate

2013年8月7日编辑:Apple拥有一套优秀的WWDC视频,真正帮助我了解Objective-C中的各种日期和时间类,以及如何正确地执行时间计算/操作。< /强>

“常见日期和时间挑战的解决方案”(HD videoSD videoslides (PDF))(WWDC 2013)
“执行日历计算”(SD videoslides (PDF))(WWDC 2011)

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

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

1 个答案:

答案 0 :(得分:14)

首先获取当周的当天:

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

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

Apple docs将工作日定义为:

  

工作日单位是数字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即可。看看get current date from [NSDate date] but set the time to 10:00 am