core data 获取本周数据
Posted
技术标签:
【中文标题】core data 获取本周数据【英文标题】:core data get data from current week 【发布时间】:2012-03-18 13:46:18 【问题描述】:我有一个核心数据上下文,其中包含存储日期的对象。我想按该顺序仅获取当前一周(周一至周日)的数据。我不是在寻找最后 7 天。
日期可以是存储在实体中的日期,也可以是对象添加到核心数据时的数据(它们是相同的)。
我可以像这样使用带有开始日期和结束日期的谓词:
NSPredicate *weekPredicate = [NSPredicate predicateWithFormat:@"((date > %@) AND (date <= %@)) || (date = nil)",startDate,endDate];
但是如何计算 startDate 和 endDate?
【问题讨论】:
【参考方案1】:-(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];
【讨论】:
【参考方案2】:说明您只需要从星期一开始的当前周意味着结束日期将是“今天”,开始日期将是:“上星期一”。
参考 Apple 的文档:
有三个主要的类用于处理日期和时间。
NSDate 允许您表示绝对时间点。
NSCalendar 允许您表示特定的日历,例如公历或希伯来历。它为大多数基于日期的计算提供了接口,并允许您在 NSDate 对象和 NSDateComponents 对象之间进行转换。
NSDateComponents 允许您表示特定日期的组件,例如小时、分钟、日、年等。
除了这些类之外,NSTimeZone 还允许您表示地缘政治区域的时区信息。它简化了跨不同时区工作和执行可能受夏令时转换影响的计算的任务。
然后您就可以查看我们当前是星期几:
NSDateComponents 有这个方法例如:
- (NSInteger)weekday
返回值 接收方的工作日单位数。
讨论 工作日单位是数字 1 到 n,其中 n 是一周中的天数。例如,在公历中,n 为 7,星期日用 1 表示。
这里是指向date and time programming guide的链接
【讨论】:
【参考方案3】:只是来自过去经常处理日期和时间的人的一些建议。日期可能会变得混乱!没有办法解决它。你最终会得到很多很多行代码和 DateCompnents 到处飞,更不用说日历和时区了,只是为了计算你认为只需要一点数学的东西。你真的应该看看臭名昭著的 Erica Sadun 的 NSDate 类别。(NSDate-Extentions)。
https://github.com/erica/NSDate-Extensions
我不知道我多么希望我能早点找到这个。还请阅读 Apple Doc 中的日期和编程指南,当您再次阅读它时,它至少不是简单的阅读。
http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/DatesAndTimes/Articles/dtDates.html
(我知道,这是评论而不是答案。)
【讨论】:
以上是关于core data 获取本周数据的主要内容,如果未能解决你的问题,请参考以下文章