【问题标题】:search by date and a time span core data按日期和时间跨度核心数据搜索
【发布时间】:2012-12-14 18:06:59
【问题描述】:

我正在处理一个核心数据项目,我有一个带有 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 来检查结果中每个元素的时间, 我想不出什么聪明的办法。

【问题讨论】:

    标签: objective-c core-data nsdate


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      我会说你希望得到如下谓词:

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

      就您如何制定适当的 Cocoa 日期对象而言,您可能希望播种两个 NSDateComponents,一个用于开始时间,一个用于结束时间,第三个简单地说“一天” '。然后使用NSCalendar(如果您对此含糊不清,只需使用当前日历)及其dateFromComponents:dateByAddingComponents:toDate:options: 方法 - 前者获取第一天的日期,然后后者将每个提前一天。

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

      您可以将每个相关日期的NSPredicates 构建到一个数组中,然后使用NSCompoundPredicate +orPredicateWithSubpredicates: 将它们全部粘合到最后一个谓词中,让您不必担心有多少是 n 运行天数。

      【讨论】:

        猜你喜欢
        • 2014-05-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多