2014-09-08 1 views
0

Я создаю таймер обратного отсчета до определенной даты, используя NSDate и NSDateFormatter. Единственная проблема заключается в том, что когда я запускаю код с другим форматом, дата испортится. Вот оригинальный код, который отлично работает.NSDate выдает неправильную дату

- (void)updateCountdown { 
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
    [dateFormatter setDateFormat:@"YYYY-MM-dd"]; 
    NSDate *startingDate = [dateFormatter dateFromString:@"2014-10-08"]; 
    NSDate *endingDate = [NSDate date]; 

    NSCalendar *calendar = [NSCalendar currentCalendar]; 
    NSUInteger unitFlags = NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit|NSHourCalendarUnit|NSMinuteCalendarUnit|NSSecondCalendarUnit; 
    NSDateComponents *dateComponents = [calendar components:unitFlags fromDate:startingDate toDate:endingDate options:0]; 

    NSInteger days  = [dateComponents day]; 
    NSInteger months = [dateComponents month]; 
    NSInteger years = [dateComponents year]; 
    NSInteger hours = [dateComponents hour]; 
    NSInteger minutes = [dateComponents minute]; 
    NSInteger seconds = [dateComponents second]; 
    NSString *countdownText = [NSString stringWithFormat:@"%ld Years %ld Months %ld Days %ld Hours %ld Minutes %ld Seconds", (long)days, (long)months, (long)years, (long)hours, (long)minutes, (long)seconds]; 

    _countdown.text = countdownText; 

    [self performSelector:@selector(updateCountdown) withObject:nil afterDelay:1]; 
} 

Но сказать, что я хочу, чтобы удалить лет, так что я изменить код так:

- (void)updateCountdown { 
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
    [dateFormatter setDateFormat:@"YYYY-MM-dd"]; 
    NSDate *startingDate = [dateFormatter dateFromString:@"2014-10-08"]; 
    NSDate *endingDate = [NSDate date]; 

    NSCalendar *calendar = [NSCalendar currentCalendar]; 
    NSUInteger unitFlags = NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit|NSHourCalendarUnit|NSMinuteCalendarUnit|NSSecondCalendarUnit; 
    NSDateComponents *dateComponents = [calendar components:unitFlags fromDate:startingDate toDate:endingDate options:0]; 

    NSInteger days  = [dateComponents day]; 
    NSInteger months = [dateComponents month]; 
    NSInteger hours = [dateComponents hour]; 
    NSInteger minutes = [dateComponents minute]; 
    NSInteger seconds = [dateComponents second]; 
    NSString *countdownText = [NSString stringWithFormat:@"%ld Months %ld Days %ld Hours %ld Minutes %ld Seconds", (long)days, (long)months, (long)hours, (long)minutes, (long)seconds]; 

    _countdown.text = countdownText; 

    [self performSelector:@selector(updateCountdown) withObject:nil afterDelay:1]; 
} 

Теперь все вдруг Дат перепутались на целый месяц. Как я могу это исправить?

Также почему вывод 0 лет 1месяц 0 дней -2 часа. Как и почему там (-) там? Благодаря!

ответ

1

вы ставите свои аргументы в неправильном порядке первый у вас есть

[NSString stringWithFormat:@"%ld Years %ld Months %ld Days %ld Hours %ld Minutes %ld Seconds", (long)days, (long)months, (long)years, (long)hours, (long)minutes, (long)seconds]; 

вы вводите

  • дней в место держатель лет
  • и лет в дни

у вас есть

[NSString stringWithFormat:@"%ld Months %ld Days %ld Hours %ld Minutes %ld Seconds", (long)days, (long)months, (long)hours, (long)minutes, (long)seconds]; 

вы вступаете

  • дней в место держателя месяцами
  • месяцев на место проведением в течение нескольких дней только последние 3 кажется, как вы собираетесь
+0

духа! Спасибо огромное! Также вы знаете, почему вывод -1 дней -2 часа -1 минут? Как вы знаете, почему там есть минусы? Спасибо огромное! – Nicholas

+0

Ну, негативы, вероятно, связаны с тем, что это обратный отсчет. поэтому, если я рассчитываю на то, что было вчера, это будет -1 день и т. д. Посмотрите на свой код, возможно, вы сравниваете свои 2 даты, чтобы сравнивать их в неправильном порядке. Это мое предположение. – RyanTCB

+0

Да, это то, о чем я думал, кроме факта, что дата у меня есть в будущем! lol – Nicholas