2012-10-10 22 views
5

编辑07/08/13:Apple拥有一套出色的WWDC视频,这些视频确实帮助我了解Objective-C中的各种日期和时间类,以及如何正确执行时间计算/操作与他们。以编程方式获取日期“下个星期日下午5点”

“解决共同日期和时间挑战”(HD videoSD videoslides (PDF))(WWDC 2013年)
“执行日历计算”(SD videoslides (PDF))(WWDC 2011)

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

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

+2

真棒链接和更新。对你好! – uchuugaka

回答

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

+0

这段代码中有一个微妙的错误。 'calendar'隐式使用当前的语言环境。如果这意味着例如新西兰时区与太平洋时区有很大不同。结果可能是代码计算下一个星期日在6或7天内,当下一个*加利福尼亚州*星期日-5在仅仅几个小时前。 –

+2

此外,当该日期发生日光变化时,计算'nextSunday'的代码会中断。 –

相关问题