我想在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
答案 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);
}
}