0

我正在处理一个核心数据项目,我有一个带有 modify_date 字段的表,我需要提取过去n天的所有条目,这些条目在(比如说)下午 1 点和晚上 9 点之间也有一个 modify_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 来检查结果中每个元素的时间之外,我想不出任何聪明的办法。

4

2 回答 2

1

我会说你希望得到一个谓词,如:

((timestamp >= <startTimeOnDayOne>) AND (timestamp <= <endTimeOnDayOne>)) OR
((timestamp >= <startTimeOnDayTwo>) AND (timestamp <= <endTimeOnDayTwo>)) OR
[...]

就如何制定适当的 Cocoa 日期对象而言,您可能想要播种两个NSDateComponents,一个用于开始时间,一个用于结束时间,第三个简单地表示“一天”。然后使用一个NSCalendar(如果你对它很模糊,只使用当前日历)及其dateFromComponents:dateByAddingComponents:toDate:options:方法——前者获取第一天的日期,然后后者将每一天提前一天。

如果您试图在每个关键时刻增加 24 小时,那么在任何有夏令时的地区,您每年都会得到两次错误的结果。

您可以将NSPredicate每个相关日期的 s 构建到一个数组中,然后在最后将它们全部粘合到一个谓词中,这样您就可以NSCompoundPredicate +orPredicateWithSubpredicates:担心运行时有多少天。

于 2012-12-18T01:58:02.937 回答
1

如果您在数据模型中存储日期类型的字段,则没有好的方法可以做到这一点。这些被存储为自参考日期以来的秒数 - 因此过滤NSDate作品,因为它是同一件事。但是,您不能基于日期组件(例如一天中的小时)构建谓词,因为数据存储对此一无所知。在大多数情况下,从数据存储中获取结果后过滤结果是一种合理的方法。

如果这是您经常做的事情,您可能会考虑添加一个或多个新属性——例如,存储一天中的小时的整数字段。然后你可以在你的NSPredicate. 每当日期字段更改时,设置这些字段的值。而且,请确保您知道这些字段所在的时区。UTC 更可取。当地时间是自找麻烦。使用 UTC,在设置字段值和获取之前,您可以将“1PM”、“9PM”等转换为 UTC 中的等价物。

最后(您可能已经意识到这一点,但从您的问题中并不明显),请注意,您链接到的另一个问题是NSPredicate在您NSString那里建立一段时间。

于 2012-12-18T01:20:16.997 回答