本周的NSDate

时间:2013-05-24 16:50:13

标签: ios objective-c nsdate nsdatecomponents

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

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中并没有用。

知道可能出现什么问题?

3 个答案:

答案 0 :(得分: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)而不是length,那么您将在本周的最后一天结束(感谢@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];

备注:此代码还根据区域设置正确处理“周开始”。

答案 1 :(得分:0)

目前尚不清楚你在哪种方面遇到困难,但可能只是在一周的第一天没有达成共识。

[旧例子编辑; Mike正确地指出它是无效的]

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

答案 2 :(得分:0)

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

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