2012-10-10 24 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'的代碼會中斷。 –

相關問題