Дата, выбранная из UIDatePicker, отличается от сохраняемой даты

Вот как я настраиваю свой datePicker

self.datePicker = [[UIDatePicker alloc] init];
self.datePicker.timeZone = [NSTimeZone localTimeZone];

Вот как я сохраняю дату, которую я выбрал

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateStyle:NSDateFormatterMediumStyle];
[formatter setTimeZone:[NSTimeZone localTimeZone]];
dateToSave = [formatter dateFromString:self.dateTextField.text];
NSLog(@"date saved = %@", dateToSave);

Если я выберу 18 ноября 2013 года из средства выбора даты, NSLog покажет

date saved = 2013-11-17 16:00:00 +0000

Однако где-то в моем коде мне нужно получить разницу в днях между сегодняшней датой и датой, которую я выбрал в средстве выбора даты.

NSDateComponents *dateComponents = [[NSCalendar currentCalendar] components:NSDayCalendarUnit fromDate:[NSDate date] toDate:dateSaved options:0];
NSLog(@"number of days => %i", [dateComponents day]);

Сегодня 10 ноября. Дата, которую я сохранил, — 18 ноября. Но разница в количестве дней — 7, а не 8.


person iPhoneJavaDev    schedule 10.11.2013    source источник
comment
возможный дубликат Почему NSDate сообщает неправильную дату?   -  person Martin R    schedule 10.11.2013
comment
Или stackoverflow.com/questions/14550249/, stackoverflow.com/questions/8466744/ и некоторые другие.   -  person Martin R    schedule 10.11.2013
comment
Каковы значения [NSDate date] и dateSaved при расчете разницы?   -  person Martin R    schedule 10.11.2013
comment
дата, которую я сохранил, ... 2013-11-17 16:00:00 +0000 сегодняшняя дата ... 2013-11-10 10:36:55 +0000   -  person iPhoneJavaDev    schedule 10.11.2013
comment
Какой часовой пояс вы использовали?   -  person Sviatoslav Yakymiv    schedule 10.11.2013
comment
[локальный часовой пояс NSTimeZone]   -  person iPhoneJavaDev    schedule 10.11.2013
comment
Как я уже упоминал в своем ответе, попробуйте использовать [NSTimeZone timeZoneForSecondsFromGMT:0].   -  person Sviatoslav Yakymiv    schedule 10.11.2013
comment
@SviatoslavYakymiv: не думаю, что это имеет смысл. Расчет количества дней следует производить по местному часовому поясу, а не по Гринвичу. Результат может отличаться из-за перехода на летнее время.   -  person Martin R    schedule 10.11.2013


Ответы (3)


(Этот ответ относится к обновленному вопросу о расчете количества дней между двумя датами.)

Проблема в том, что [NSDate date] – это текущая дата+время, а не начало текущего дня. Например, если

 [NSDate date] = "2013-11-10 10:00:00"
 dateSaved     = "2013-11-18 00:00:00"    (both in your *local* timezone)

тогда разница между этими двумя датами составляет «7 дней и 14 часов». Поэтому вы получаете 7 как количество дней.

Итак, вам нужно сначала рассчитать начало текущего дня:

NSDate *startOfDay;
[[NSCalendar currentCalendar] rangeOfUnit:NSDayCalendarUnit
                                startDate:&startOfDay
                                 interval:NULL
                                  forDate:[NSDate date]];

а затем использовать его при вычислении разницы:

NSDateComponents *dateComponents = [[NSCalendar currentCalendar] components:NSDayCalendarUnit
                                           fromDate:startOfDay
                                             toDate:dateSaved
                                            options:0];
person Martin R    schedule 10.11.2013
comment
учитывая точно такой же код, который я использовал для своего средства выбора даты, и способ, которым я сохранил выбранную дату, и учитывая, что сегодня 10 ноября 19:28, а дата, которую я сохранил, - 18 ноября, вот что я получил... дата сохранена = 2013-11-17 16:00:00 +0000 дата сегодня = 2013-11-09 16:00:00 +0000 я получил правильную разницу в днях, поэтому я предполагаю, что вышесказанное верно, верно? - person iPhoneJavaDev; 10.11.2013
comment
@iPhoneJavaDev: сегодняшняя дата = 2013-11-09 16:00:00 +0000, что вы рассчитали с кодом из моего ответа? Да, это выглядит правильно, потому что это 2013-11-10 00:00:00 в вашем местном часовом поясе. - person Martin R; 10.11.2013

Ваш часовой пояс -8. 2013-11-17 16:00:00 +0000 равно 2013-11-18 00:00:00 -0800.

Используйте [NSTimeZone timeZoneForSecondsFromGMT:0] вместо [NSTimeZone localTimeZone]

person Sviatoslav Yakymiv    schedule 10.11.2013
comment
Я обновил свой вопрос. Извините, но настоящая проблема заключается в том, что я пытался получить разницу между сегодняшней датой и датой, которую я сохранил. - person iPhoneJavaDev; 10.11.2013
comment
я пробовал, но [день dateComponents] по-прежнему возвращает мне 7 вместо 8 - person iPhoneJavaDev; 10.11.2013
comment
Попробуйте записать обе даты. я думаю вы увидите разницу. - person Sviatoslav Yakymiv; 10.11.2013

NSDateFormatter *date_form=[[NSDateFormatter alloc]init];

[date_form setDateFormat:@"dd/MM/yyyy"];

NSDate *seletected_date = [datepicker date];

NSString *dateToSave=[[NSString alloc] initWithFormat:@"%@",[date_form stringFromDate:seletected_date]]; 

NSLog(@"date saved = %@", dateToSave);

Удалить локальный часовой пояс

person Parthi    schedule 10.11.2013