0

我使用当前方法获取本周的第一天和最后一天:

NSDate *weekDate = [NSDate date];
NSCalendar *myCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

NSDateComponents *currentComps = [myCalendar components:( NSYearCalendarUnit | NSMonthCalendarUnit | NSWeekOfYearCalendarUnit | NSWeekdayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit) fromDate:weekDate];

[currentComps setWeekday:1]; // 1: sunday
NSDate *firstDayOfTheWeek = [myCalendar dateFromComponents:currentComps];
[currentComps setWeekday:7]; // 7: saturday
NSDate *lastDayOfTheWeek = [myCalendar dateFromComponents:currentComps];

这是完美的,但现在在 ios 4.3 中并且它不工作。

知道可能是什么问题吗?

4

3 回答 3

1

我已经在我的 OS X 10.6 分区上启动了 Xcode 4.1,并尝试针对 iOS 4.3 SDK 编译您的代码。原来NSWeekOfYearCalendarUnit是未定义的,所以后来的iOS版本中肯定已经引入了。这或许可以解释为什么它在 iOS 4.3 上不起作用。

以下替代代码有效并给出了正确的结果:

NSDate *now = [NSDate date];
NSCalendar *myCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

NSDate *firstDayOfTheWeek;
NSTimeInterval length;
[myCalendar rangeOfUnit:NSWeekCalendarUnit
                                startDate:&firstDayOfTheWeek
                                 interval:&length
                                  forDate:now];
NSDate *lastDayOfTheWeek = [firstDayOfTheWeek dateByAddingTimeInterval:length];

更新:上面的代码给出了一周的第一天(开始)和下周的(开始)。如果您添加(length - 1)而不是lengththen 您将在一周的最后一天结束(感谢@rmaddy!)。或者,您可以将 6 天添加到第一天:

NSDate *now = [NSDate date];
NSDate *firstDayOfTheWeek;
NSCalendar *myCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
[myCalendar rangeOfUnit:NSWeekCalendarUnit
                                startDate:&firstDayOfTheWeek
                                 interval:NULL
                                  forDate:now];
NSDateComponents *sixDays = [[NSDateComponents alloc] init];
[sixDays setDay:6];
NSDate *lastDayOfTheWeek = [myCalendar dateByAddingComponents:sixDays toDate:firstDayOfTheWeek options:0];

备注:此代码还根据语言环境正确处理“一周开始”。

于 2013-05-24T17:57:40.803 回答
0

目前尚不清楚您在何种意义上遇到了困难,但可能只是对于哪一天是一周的第一天没有达成共识。

[旧示例已编辑;下面的迈克正确地指出它是无效的]

根据 NSDateComponents 文档,“例如,在公历中,n 为 7,星期日由 1 表示。”;如果您的设备使用 iOS 支持的其他九种日历中的任何一种——例如佛教、中国或希伯来日历——那么 Apple 不保证星期日是第一天。

于 2013-05-24T17:19:19.253 回答
0

您的第三个组件NSWeekOfYearCalendarUnit仅在 iOS 5 中可用。请参阅https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSCalendar_Class/Reference/NSCalendar.html。我相信对于您正在做的事情,您不需要该组件,您应该可以将其删除。

至于这篇文章中其他人的本地化评论,他们是正确的,事情在不同的语言环境中发生了变化,但不是你所期望的那样。星期日确实总是第 1 天(和星期六第 7 天),但在星期一是一周的第一天的文化中,您的代码将返回下一个星期六和下一个星期日,似乎是在周末。您可以通过将日历显式设置为使用 en-US 区域设置来解决此问题,或者尝试使用 firstDayOfWeek 属性来考虑其他区域设置。您可以通过在设置 > 常规 > 国际 > 区域格式中将模拟器的区域格式切换到德语 > 德国来测试这一点。

于 2013-05-24T18:03:57.510 回答