核心数据从本周获取数据
我有一个核心数据上下文中的对象有一个date存储在其中。 我只想按照这个顺序获取当周(星期一到星期天)的数据。 我不是在找最后的7天。
date可以是实体内存储的数据,也可以是对象添加到核心数据时的数据(它们是相同的)。
我可以使用这样的开始date和结束date的谓词:
NSPredicate *weekPredicate = [NSPredicate predicateWithFormat:@"((date > %@) AND (date <= %@)) || (date = nil)",startDate,endDate];
但我如何计算startDate和endDate?
-(NSDate *) lastMondayBeforeDate:(NSDate*)timeStamp { NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; NSDateComponents *comps = [gregorian components:NSWeekdayCalendarUnit fromDate:timeStamp]; NSInteger weekday = [comps weekday]; weekday = weekday==1 ? 6 : weekday-2; // start with 0 on Monday rather than 1 on Sunday NSTimeInterval secondsSinceMondayMidnight = (NSUInteger) [timeStamp timeIntervalSince1970] % 60*60*24 + weekday * 60*60*24; return [timeStamp dateByAddingTimeInterval:-secondsSinceMondayMidnight]; } -(NSDate *) nextMondayAfterDate:(NSDate*)timeStamp { return [[self lastMondayBeforeDate:timeStamp] dateByAddingTimeInterval:60*60*24*7]; }
说明你只需要从星期一开始的本周就意味着结束date将是“今天”,开始date是“最后一个星期一”。
参考苹果的文档:
有三个主要类用于处理date和时间。
NSDate允许你表示一个绝对的时间点。
NSCalendar允许您表示一个特定的日历,如公历或希伯来日历。 它为大多数基于date的计算提供了接口,并允许您在NSDate对象和NSDateComponents对象之间进行转换。
NSDateComponents允许您表示特定date的组件,例如小时,分钟,日,年等。
除了这些课程,NSTimeZone还允许您代表地缘政治区域的时区信息。 它简化了在不同时区工作并执行可能受夏时制转换影响的计算的任务。
然后,您可以查看我们目前的星期几。
NSDateComponents有这样的方法,例如:
- (NSInteger)weekday
返回值接收方的工作日单位数。
讨论平日单位是数字1到n,其中n是一周中的天数。 例如,在公历中,n是7,星期天是1。
这里是date和时间编程指南的链接
只是从过去很多人的date和时间的一些人的build议。 date会变得凌乱! 这是没有办法的。 你结束了许多代码行和DateCompnents到处飞,更不要说日历和时区,只是为了计算一些你认为只需要一点math的东西。 你真的应该看看臭名昭着的Erica Sadun的NSDate类别(NSDate-Extentions)。
https://github.com/erica/NSDate-Extensions
我不知道我多希望早点发现。 还请阅读Apple Doc中的date和编程指南,当您再次读取它时,至less不会轻读。
(我知道,这是一个评论不是答案。)