IOS 4.1 NSDateComponents提供与IOS的更高版本不同的日期

时间:2011-08-30 16:25:57

标签: iphone ios4 nsdate

我创建了一个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 个答案:

答案 0 :(得分:1)

你应该重新考虑你没有使用年份的断言。当然,2011-09-04和(由NSGregorianCalendar用于1582-10-15之前的日期的朱利安日历)0001-09-04都是星期日,所以看起来没关系。但明年它不会匹配。

您在两台设备上的不同结果的问题很可能是您的设备设置为不同的区域,不同的规则是关于哪一天是一周的第一天或哪一周是一年中的第一天。您可以检查NSCalendar对象上的firstWeekday属性以确定第一个属性,minimumDaysInFirstWeek将帮助确定后者。