Добавление дня в NSDate, когда день не равен 24 часам - iOS - PullRequest
1 голос
/ 09 октября 2011

Я хочу добавить день к объекту 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 ]

2 голосов
/ 09 октября 2011

Это не ошибка, это то, как метод NSDate description форматирует дату для вашей регистрации.Помните, NSDate просто хранит временной интервал с контрольной даты, поэтому добавление количества дней в днях всегда увеличивает его на день.В вашем часовом поясе переход на летнее время начинается 13 марта, поэтому 24 часа после полуночи в день до означает 1 час ночи.

Что касается вашего комментария о том, как это исправить, что вы хотите исправить?Код в вашем вопросе добавит 24 часа к alarmTime, пока alarmTime не появится в будущем.Если ваше требование на самом деле состоит в том, что пользователь входит, скажем, в 5 утра, и вы хотите, чтобы alarmTime было следующим 5 утра, то на самом деле это не тот путь, вам лучшевыключить синтез новой даты, используя NSDateComponents.

0 голосов
/ 10 октября 2011

Вот код, который я сейчас использую, который исправляет эту проблему:


-(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);
    }
}
...