核心数据:基于 NSDate 的时间分量过滤条目

Posted

技术标签:

【中文标题】核心数据:基于 NSDate 的时间分量过滤条目【英文标题】:Core Data: filtering entries based on time component of NSDate 【发布时间】:2012-06-11 08:35:20 【问题描述】:

我有一个属性为time 的实体,它的类型是Date。我只关心它的时间部分。在生成类文件时,我选择对原始数据类型使用标量属性。所以,NSTimeInterval 被用来代替NSDate

要存储time 属性,我必须先用NSDateFormatter 解析字符串,然后再将其分配给实体:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"H:mm"];

NSTimeInterval time = [[dateFormatter dateFromString:@"19:20"] timeIntervalSince1970];
entity.time = time;

当使用谓词获取记录时,我再次使用NSDateFormatter 来“截断”日期部分:

NSDate *timeNow = [self.defaultDateFormatter dateFromString:
    [self.defaultDateFormatter stringFromDate:[NSDate date]]];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"time >= %@", timeNow];
// build the rest of the NSFetchRequest...

问题是,所有记录都回来了:一些记录在timeNow 之前有time 属性,而一些在之后。但是,当我使用[NSDate compare:]timeNow 与返回记录的time 属性进行比较时,它实际上返回了正确的结果!

哪里出错了?

【问题讨论】:

为什么要在第二段代码中进行日期->字符串->日期的双向转换? 两个原因:(1)这样转换与第一次插入数据库时​​相同,(2)这是自 1970 年以来基于时间间隔获取时间分量的最快方法,也就是数据库中存储的时间间隔。 【参考方案1】:

如果我理解得很好,您需要跟踪时间 H:mm。日、月、年是没有意义的。对吧?

如果您需要分钟分辨率(最大 1440),为什么不使用 int16_t,如果需要第二分辨率(最大 86400),为什么不使用 int32_t,以及一些非常基本的方法可以从基本单位转换为最适合您需要的东西,例如 NSDateComponents用于 NSCalendar 计算? NSDate 和 NSTimeInterval 不太适合这项任务,是吗?

【讨论】:

以上是关于核心数据:基于 NSDate 的时间分量过滤条目的主要内容,如果未能解决你的问题,请参考以下文章

作为获取谓词的日期范围 - 核心数据之间的 NSDate 谓词

使用 NSDate 的核心数据排序描述符,使用 Swift 的 iOS

从出现在 NSPopUpButton 列表中的核心数据实体中过滤条目

iOS - 如何刷新/更新核心数据瞬态属性?

将核心数据过滤/排序到数组中

按核心数据中的日期组件获取条目