我正在开发一个Core Data项目,我有一个带有modification_date字段的表, 我需要提取最后 n 天的所有条目,这些条目在下午1点和晚上9点之间也有一个modification_date。
我已经整理出部分解决方案,只提取最后 n 天的条目 如:Core Data- predicate with dates
中的建议NSDate *today = [NSDate date];
NSDate *end_day = [today addTimeInterval: (days*86400.0f)];
day_st = [NSString stringWithFormat: @"(timestamp >= %@) AND (timestamp <= %@) AND ", today, end_day];
我现在唯一的问题是,按时间跨度添加过滤器。 但是,除了使foreach检查结果中每个元素的时间外, 我无法想出任何聪明的东西。
答案 0 :(得分:1)
如果您在数据模型中存储日期类型字段,则无法做到这一点。这些存储为自参考日期以来的秒数 - 因此对NSDate
的过滤有效,因为它是相同的。但是,您无法基于日期组件(例如一天中的小时)构建谓词,因为数据存储不知道有关这些的谓词。在大多数情况下,从数据存储中获取结果后过滤结果是一种合理的方法。
如果您要做很多事情,可以考虑添加一个或多个新属性 - 例如,存储一天中小时的整数字段。然后,您可以在NSPredicate
中添加这些字段。每次日期字段更改时设置这些字段的值。并且,确定你知道这些领域在哪个时区。 UTC是首选。当地时间要求麻烦。在设置字段的值和提取之前,使用UTC将“1PM”,“9PM”等转换为UTC中的等效值。
最后(您可能已经意识到这一点,但从您的问题中并不明显),请注意,您链接到的另一个问题是在NSPredicate
时建立NSString
。
答案 1 :(得分:1)
我会说你最终会得到一个谓词:
((timestamp >= <startTimeOnDayOne>) AND (timestamp <= <endTimeOnDayOne>)) OR
((timestamp >= <startTimeOnDayTwo>) AND (timestamp <= <endTimeOnDayTwo>)) OR
[...]
就你如何制定适当的Cocoa日期对象而言,你可能想要种子两个NSDateComponents
,一个用于开始时间,一个用于结束时间,第三个用于简单地说'一天'。然后使用NSCalendar
(只是当前日历,如果你对它有些模糊)及其dateFromComponents:
和dateByAddingComponents:toDate:options:
方法 - 前者获取第一天的日期,然后后者每天提前一天。
如果你想在每个时刻增加24小时,那么每年两次在夏令时的任何领域都会得到错误的结果。
您可以将每个相关日期的NSPredicate
构建到一个数组中,然后使用NSCompoundPredicate +orPredicateWithSubpredicates:
将它们全部粘合在一起作为一个谓词,让您担心有多少是 n 在运行时间。