IOS 4.1 NSDateComponents, дающие другую дату, чем более поздние версии IOS - PullRequest
0 голосов
/ 30 августа 2011

Я создал категорию NSDate, которая дала бы мне дату «последнего воскресенья».

+(NSDate *)sunday{
  // I need 2 dates yesterday and today
  NSCalendar *gregorian   = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
  NSDate *now = [NSDate date];
  NSLog(@"Current date: %@", now);
  NSDateComponents *components = [gregorian components:(NSWeekCalendarUnit | NSWeekdayCalendarUnit ) fromDate:now];
  [components setWeekday:1]; //Monday 
  [components setHour:0]; //8a.m.
  [components setMinute:0];
  [components setSecond:0];
  NSLog(@"Sunday: %@", [gregorian dateFromComponents:components]);
  return [gregorian dateFromComponents:components]; 
}

Это дает мне пару разных дат:

IOS 4.2

Sunday: 0001-08-28 05:50:36 +0000

IOS 4.1

Sunday: 0001-09-04 05:50:36 GMT

Обратите внимание То, что IOS 4.1 дает мне будущую дату, тогда как IOS 4.2 дает мне предыдущую дату, что я и хочу.

Я понимаю, что показывается год 0001, но год не используется.

Я еще не нашел, где другие имеют такую ​​же проблему, поэтому, возможно, я делаю что-то не так.Но я не уверен, что это такое.Кто-нибудь видел это раньше?

РЕДАКТИРОВАТЬ Вот мой рабочий код:

+(NSDate *)sunday{
  NSCalendar *gregorian   = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
  NSDate *now = [NSDate date];
  NSDateComponents *components = [gregorian components:(NSWeekCalendarUnit | NSYearCalendarUnit | NSWeekdayCalendarUnit ) fromDate:now];
  [components setWeekday:[gregorian firstWeekday]]; //Sunday
  [components setHour:0]; 
  [components setMinute:0];
  [components setSecond:0];
  return [gregorian dateFromComponents:components];
}

Спасибо !!

1 Ответ

1 голос
/ 30 августа 2011

Вам, вероятно, следует пересмотреть свое утверждение о том, что год не используется.Конечно, 2011-09-04 и (согласно юлианскому календарю, используемому NSGregorianCalendar для дат до 1582-10-15) 0001-09-04 - оба воскресенья, так что, похоже, это не имеет значения.Но в следующем году он не будет совпадать.

Ваша проблема с разными результатами на двух устройствах, скорее всего, состоит в том, что ваши устройства настроены на разные регионы, с разными правилами относительно того, какой день является первым днемнеделя или какая неделя является первой в году.Вы можете проверить свойство firstWeekday объекта NSCalendar, чтобы определить первое, а minimumDaysInFirstWeek поможет с последним.

...