Путаница по поводу 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]);
Можно использовать любой стиль даты / времени, который вы хотите (короткий, средний, длинный, полный), а также установить собственный формат, используя синтаксис форматирования даты