2011-10-09 75 views
1

如果過去(對於鬧鐘),我想添加一天到NSDate對象。但是,如果我只是添加60 * 60 * 24秒,我遇到了一個問題。它像通常所需的那樣增加24小時,但在這種情況下,一天等於23小時。我該如何解決?這是下面的代碼:當一天不等於24小時時向NSDate添加一天 - iOS

while ([alarmTime compare:[[NSDate alloc] init]] == NSOrderedAscending) { 
     alarmTime = [alarmTime dateByAddingTimeInterval:(60*60*24)]; //if in the past add a day 
     NSLog(@"alarm %@ is in the past, adding a day", alarmTime); 
    } 

22:19:59.506: alarm 03/12/2011 12:00:00 AM is in the past, adding a day 
22:19:59.506: alarm 03/13/2011 12:00:00 AM is in the past, adding a day 
22:19:59.507: alarm 03/14/2011 01:00:00 AM is in the past, adding a day 
22:19:59.507: alarm 03/15/2011 01:00:00 AM is in the past, adding a day 
+1

不直接關係到你的問題,但你有一個嚴重的內存泄露那裏。使用[NSDate date]創建一個NSDate變量,並將其用於比較。 – jrturton

+1

它也困擾我。但我想用ARC不會再有泄漏了。這將需要一些習慣... – nschum

+0

@nschum - 即使它不是泄漏,這是浪費資源。 – jrturton

回答

0

這裏是我現在用的是糾正這個問題的代碼:


-(void) correctDate {   
    // Create an interval of one day 
    NSDateComponents *dayComponent = [[NSDateComponents alloc] init]; 
    dayComponent.day = 1; 

    NSCalendar *theCalendar = [NSCalendar currentCalendar]; 

    // if its in the past, add day 
    while ([alarmTime compare:[NSDate date]] == NSOrderedAscending) { 
     alarmTime = [theCalendar dateByAddingComponents:dayComponent toDate:alarmTime options:0]; //add a day 

     NSLog(@"alarm %@ is in the past, adding a day", alarmTime); 
    } 
} 
2

這是不是一個錯誤,它的NSDate的description方法如何格式化您的日誌的日期。請記住,NSDate只是存儲自引用日期以來的一段時間間隔,因此添加一天的秒數總是會將其增加一天。在您的時區,夏令時開始於3月13日,因此在前一天的午夜之後24小時是凌晨1點。

關於如何解決這個問題的評論,你想解決什麼問題?您的問題中的代碼將在alarmTime之前添加24小時,直到alarmTime將來。如果你的要求實際上是用戶輸入的時間是上午5點,並且你希望alarmTime成爲下一個上午5點,那麼這不是真正的方法,你最好用綜合一個新的日期NSDateComponents

+0

那我該如何解決這個問題? – michaellindahl