iOS - проблема TimeZone с разницей между 2 NSDates
Я использую NSCalendar и NSDateComponents, чтобы вернуть разницу (в днях) между 2 датами. Вот код, который я использую, чтобы получить это.
NSCalendar *calendar = [NSCalendar currentCalendar];
calendar.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];
NSDate *todayDate = [NSDate date];
NSDateComponents *comps = [calendar components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit)
fromDate:todayDate];
[comps setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
NSDate *today = [calendar dateFromComponents:comps];
NSDate *startDate = self.date;
NSDate *endDate = today;
NSLog(@"startDate: %@",startDate);
NSLog(@"endDate: %@",endDate);
NSDateComponents *components = [calendar components:NSDayCalendarUnit
fromDate:endDate
toDate:startDate
options:0];
[components setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
NSInteger days = [components day];
Странная часть в том, что это прекрасно работает в начале дня, но как только я достигаю около 6 или 7 вечера (я использую Mountain Time, который, я думаю, GMT -7), он перестает работать правильно. Вместо возврата правильной разницы, она возвращает разницу минус 1 день. Например, он возвращает -1 вместо 0 или 1 вместо 2.
Я предполагаю, что это проблема часового пояса. Кто-нибудь знает как это исправить? Я попытался установить timeZone для моего NSCalendar и NSDateComponents на GMT, локальный и системный, но, похоже, ни один из них не работает.
Есть идеи?
Спасибо!
1 ответ
Похоже, что код не обрабатывает дробную разницу между днями. Например, если начальная дата - вчера в 23:59, а конечная дата - сегодня в 12:01, код сообщит разницу как 0 дней. Если вы считаете, что это разница в 1 день, тогда код должен обрабатывать этот случай.
Если вы выбираете self.date с помощью средства выбора даты, self.date содержит дату плюс текущее местное время. В 6 или 7 часов вечера по местному времени наступает полночь по Гринвичу (т. Е. Завтра WRT по местному времени), что приводит к неожиданному значению -1 в расчете разницы.