我有一个核心数据上下文,其中包含存储日期的对象。我想按顺序获取本周(周一至周日)的数据。我不是在寻找最近7天。
日期可以是存储在实体中的日期,也可以是将对象添加到核心数据时的数据(它们是相同的)。
我可以使用带有开始日期和结束日期的谓词,如下所示:
NSPredicate *weekPredicate = [NSPredicate predicateWithFormat:@"((date > %@) AND (date <= %@)) || (date = nil)",startDate,endDate];
但是如何计算startDate和endDate?
答案 0 :(得分:3)
-(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];
}
答案 1 :(得分:1)
声明您只需要从星期一开始的当前一周意味着结束日期将是&#34;今天&#34;和开始日期:&#34;上周一&#34;。
请参阅Apple的文档:
有三个主要类用于处理日期和时间。
NSDate允许您表示绝对时间点。
NSCalendar允许您表示特定日历,例如格里高利或希伯来日历。它为大多数基于日期的计算提供了接口,并允许您在NSDate对象和NSDateComponents对象之间进行转换。
NSDateComponents允许您表示特定日期的组件,例如小时,分钟,日,年等。
除了这些课程,NSTimeZone还允许您表示地缘政治区域的时区信息。它简化了跨越不同时区工作的任务,并执行可能受夏令时转换影响的计算。
然后,您将能够查看我们目前所处的哪一天:
NSDateComponents具有此方法,例如:
- (NSInteger)weekday
的链接返回值 接收器的工作日单位数。
讨论 工作日单位是数字1到n,其中n是一周中的天数。例如,在公历中,n为7,星期日由1表示。
答案 2 :(得分:1)
过去曾经过很多日期和时间的人的建议。日期会变得混乱!没有办法绕过它。最后,你会发现很多很多代码和日期组件飞到各处,更不用说日历和时区了,只是为了计算你认为只需要一点数学的东西。你真的应该看看臭名昭着的Erica Sadun的NSDate类别。(NSDate-Extentions)。
https://github.com/erica/NSDate-Extensions
我不知道我多么希望我能早点找到它。另请阅读Apple Doc的日期和编程指南,当你再次读完它时,它至少不是轻读。
(我知道,这是评论而不是答案。)