NSDate и следующий день - PullRequest
2 голосов
/ 31 июля 2011

Я использовал метку времени, а затем добавил 86400 секунд (24 * 60 * 60). Когда я читал недавний вопрос о stackoverflow, отмечая, что это неправильно для каждого дня, я хочу изменить это.

Итак, следующее, что я придумал, - это использование NSDateComponents. Я просто получаю текущий день и добавляю 1. Теперь мне было интересно, насколько это «умно». Например, если день равен 31, устанавливает ли он день равным 1, а месяц - равным +1 (или когда снова 12 к 1)? Я могу сделать это вручную, но это будет правильно работать только для григорианского календаря, поэтому я не знаю, будет ли это хорошим решением.

Ответы [ 2 ]

3 голосов
/ 31 июля 2011

Это умно, если только вы не хотите, чтобы это было глупо.

С документация для -[NSCalendar dateByAddingComponents:toDate:options]:

Если вы не укажете опции (вы передадите 0), переполнение в единице будет перенесено в более высокие единицы (как в типичном сложении).

Если бы вы не хотели, чтобы единицы переполнились на более высокие единицы, то вы бы передали «NSWrapCalendarComponents» в качестве значения параметра options:.

0 голосов
/ 01 октября 2011

Будьте очень осторожны с DST.Это отличается для разных часовых поясов. И это происходит в полночь Я полагаю, что если вы позвоните [дата NSCalendar путем добавления компонентов: toDate: options], а ваша дата будет между 11-12 вечера, вы рискуете пропустить или повторно запустить день из-за летнего времени.Чтобы обойти это, рекомендуется изменить дату на полдень дня, а затем добавить день.

// increment by 1 calendar day
// and convert back to NSDate objects
NSDateComponents *comps = [[[NSDateComponents alloc] init] autorelease];
[comps setDay:1];

NSCalendar *gregorian = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
[gregorian setTimeZone:self.myTimeZone]; // time zone of location;  

// Use local noontime for the date to avoid problems around
// midnight, particularly near daylightsavings time discontinuities. 
NSUInteger unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;
NSDateComponents* dateComponents = [gregorian components:unitFlags fromDate:date];

dateComponents.hour = 12;
NSDate* noonDate = [gregorian dateFromComponents:dateComponents];

NSDate *newDate = [gregorian dateByAddingComponents:comps toDate:noonDate options:0];

Я не уверен насчет параметров: настройка 0, но я проверил это довольно тщательно.Я использую его, чтобы получить массив с датами 10 дней.Это дает правильную упаковку вокруг различных разрывов дня / месяца / года.Проверьте SunPose Rise Set в магазине приложений, если хотите протестировать его.(да, это бесплатно)

...