NSDateComponents дает неправильный день для 28 февраля - PullRequest
0 голосов
/ 02 апреля 2011

Я пытаюсь выполнить поиск в феврале. Итак, я хочу выяснить, будет ли последний день 28 или 29. Я делаю вычитание с конца марта

NSDate* endFeb = [march dateByAddingTimeInterval: (NSTimeInterval) -24 * 3600];
NSDateComponents *feb = [gregorian components: units fromDate: endFeb];

, что дает мне правильную дату, но не правильный день

(gdb) po [gregorian dateFromComponents: feb]
2011-02-28 00:00:00 +0000
(gdb) p (int) [feb day]
$1 = 27

Это на симуляторе iPad 4.3, если это имеет значение.

1 Ответ

2 голосов
/ 02 апреля 2011

Чтобы выяснить, есть ли в феврале 28 или 29 дней, вы должны использовать что-то вроде этого:

NSCalendar *calendar = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];

NSDateComponents *components = [[[NSDateComponents alloc] init] autorelease];
[components setYear:2008];
[components setMonth:2];
[components setDay:1];
NSDate *febDate = [calendar dateFromComponents:components];

NSRange range = [calendar rangeOfUnit:NSDayCalendarUnit inUnit:NSMonthCalendarUnit forDate:febDate];

NSLog(@"%u days in february", range.length);

Таким образом, вам не нужно связываться со смещением часового пояса. Я думаю, что это проблема с вашим кодом.

...