У меня есть кусок кода, который работал в прошлом (по крайней мере, я думаю, что он работал, потому что в противном случае проблема была бы распознана ранее). Через несколько недель, может быть после DST, он начал давать неверные результаты.
Этот фрагмент должен генерировать объект NSDate, ссылающийся на первый день данной недели дат в 00:00.
NSCalendar *gregorianCalender = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
NSDate *firstDayDate;
unsigned yearAndWeek = NSTimeZoneCalendarUnit | NSYearCalendarUnit | NSWeekCalendarUnit;
// retrieve the components from the current date
NSDateComponents *compsCurrentDate = [gregorianCalender components:yearAndWeek fromDate:date];
[compsCurrentDate setWeekday:2]; // Monday
[compsCurrentDate setHour:0];
[compsCurrentDate setMinute:0];
[compsCurrentDate setSecond:0];
// make a date from the modfied components
firstDayDate = [gregorianCalender dateFromComponents:compsCurrentDate];
NSLog(@"MONDAY: %@", firstDayDate);
Сегодня 24 мая, поэтому последняя строка должна напечатать что-то вроде
MONDAY: 2011-05-23 00:00:00 +0000
но это действительно печатает следующее
MONDAY: 2011-05-22 22:00:00 +0000
что явно не так. 22 мая было последним воскресеньем. Теперь, чтобы сделать странные вещи, результат снова правильный, когда я изменяю setHour:0
на
[compsCurrentDate setHour:2];
Я предполагаю, что с часовыми поясами что-то не так. Но потратив полдня на документацию Apple, google и stackoverflow, я не мог понять, в чем проблема. Возможно, я использую неправильные ключевые слова, или я единственный, с этой проблемой.
Каждый кусок информации высоко ценится! Пожалуйста, дайте мне знать, что вы думаете! Спасибо!