2013年8月7日编辑:Apple拥有一套优秀的WWDC视频,真正帮助我了解Objective-C中的各种日期和时间类,以及如何正确地执行时间计算/操作。< /强>
“常见日期和时间挑战的解决方案”(HD video,SD video,slides (PDF))(WWDC 2013)
“执行日历计算”(SD video,slides (PDF))(WWDC 2011)
注意:链接需要免费的Apple Developer会员资格。
我正在为朋友的播客写一个应用程序。她每周日下午5点播放她的节目直播,我想在我的应用程序中编写一些代码,以便选择安排当时的本地通知,以便提醒用户下次现场节目的时间。我如何获得代表“下一个星期日太平洋时间下午5点”的NSDate对象。 (显然,这必须转换为用户正在使用的任何时区)
答案 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