Путаница по поводу NSDateComponents

У меня есть этот метод, который удаляет все объекты в словаре, если новый день начался:

-(void)flushDictionaryIfNeeded{

    NSLog(@"Flush called");
    if([self.messagedTodayDict count]>0) {

        //get any date
        NSDate *aDate = nil;
        NSArray *values = [self.messagedTodayDict allValues];
        aDate = [values objectAtIndex:0];

        NSDateComponents *otherDay = [[NSCalendar currentCalendar] components:NSCalendarUnitEra|NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay fromDate:aDate];
        NSDateComponents *today = [[NSCalendar currentCalendar] components:NSCalendarUnitEra|NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay fromDate:[NSDate date]];
        NSLog(@"Today is %@",[NSDate date]);
        NSLog(@"Date in the dicitonary is %@",aDate);

        if([today day] == [otherDay day] &&
           [today month] == [otherDay month] &&
           [today year] == [otherDay year] &&
           [today era] == [otherDay era]) {

            NSLog(@"Don't flush");
        }

        else {

            NSLog(@"It's a new day! erase dictionary!");
            [self.messagedTodayDict removeAllObjects];

        }

    }

}

Я живу на Тайване, NSLog для любой даты, которую я печатаю, на 8 часов отстает от времени здесь. Я называю этот метод за пять минут до полуночи (тайваньское время), я получаю это:

Today is 2015-04-03 15:55:09 +0000
Date in the dicitonary is 2015-04-03 15:09:09 +0000

Это имеет смысл, даты хранятся как 8 часов назад, и словарь не сбрасывает / удаляет все объекты.

Теперь я вызываю метод в полночь:

Today is 2015-04-03 16:00:22 +0000
Date in the dicitonary is 2015-04-03 15:09:09 +0000

и словарь удаляет все объекты. Почему это происходит, если я сравниваю компоненты даты ниже? Месяц и день совпадают для сегодняшнего дня и даты в словаре. Не очень понимаю, что здесь происходит. Некоторые указатели будут по достоинству оценены.

1 ответ

Решение

Когда вы NSLog объекта даты напрямую, вы получите дату в UTC, как у вас выше. Но компоненты даты будут соответствовать вашему местному часовому поясу (если вы не измените часовой пояс). [NSCalendar currentCalendar] дает вам календарь на основе вашей текущей локали, включая часовой пояс ( см. здесь).

Если вы хотите правильно регистрировать даты, используйте NSDateFormatter:

NSDateFormatter* formatter = [NSDateFormatter new];
formatter.dateStyle = NSDateFormatterLongStyle;
formatter.timeStyle = NSDateFormatterLongStyle;
NSLog(@"%@",[fomatter stringFromDate: yourDate]);

Можно использовать любой стиль даты / времени, который вы хотите (короткий, средний, длинный, полный), а также установить собственный формат, используя синтаксис форматирования даты

Другие вопросы по тегам