当一天不等于24小时时,为NSDate添加一天 - iOS

时间:2011-10-09 05:29:54

标签: iphone objective-c nsdate ios5 dst

我想在NSDate对象中添加一天(如果它在过去)(用于警报)。但是,如果我只添加60 * 60 * 24秒,我就遇到了问题。它增加了24小时,就像通常想要的那样,但在这种情况下,一天等于23小时。我该如何解决?以下是代码:

 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

2 个答案:

答案 0 :(得分:2)

这不是错误,它是NSDate的description方法格式化日志记录日期的方式。请记住,NSDate只存储自参考日期以来的时间间隔,因此添加一天的秒数将始终增加一天。在您的时区,夏令时从3月13日开始,所以在 凌晨1点的前一天午夜后24小时。

关于如何解决此问题的评论,您想要修复什么?您的问题中的代码会在alarmTime后24小时内添加,直到alarmTime为止。如果您的要求实际上是用户输入,比如说,早上5点,并且您希望alarmTime成为下一个凌晨5点,那么这不是真正的方法,你'最好使用NSDateComponents合成一个新日期。

答案 1 :(得分: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);
    }
}