swift - 如何通过 NSDate 属性过滤 Realm 对象

标签 swift nsdate realm

我正在尝试过滤 Realm 对象以查找 createdAt 日期小于一年前的对象:

let datex = NSCalendar.currentCalendar().startOfDayForDate(NSDate()).dateByAddingTimeInterval(-1*365*24*60*60)
let list = RealmDB.objects(TaskList).filter("createdAt <= '\(datex)'")

我收到以下错误:

Expected object of type date for property 'createdAt' on object of type 'TaskList', but received: '2015-03-19 21:00:00 +0000'

我该如何解决这个问题?日期和时间值看起来也已调整为时区。我怎样才能确定日期真的是一天的结束?

最佳答案

直接的问题是您使用 Swift 的字符串插值来构建谓词,而不是使用 NSPredicate 的参数替换。这导致您的谓词类似于:

createdAt <= '2015-03-19 07:00:00 +0000'

这试图将日期 createdAt 与字符串文字进行比较。使用 NSPredicate 的参数替换看起来像:

let list = RealmDB.objects(TaskList).filter("createdAt <= %@", datex)

请注意,在遇到闰日、闰秒、夏令时不连续等情况时,您计算日期的方式是不正确的。您应该使用 NSCalendar 的方法进行日期数学运算,而不是使用魔术常量进行数学运算:

let calendar = NSCalender.currentCalendar()
let datex = calendar.dateByAddingUnit(.Year, value: -1, toDate: calendar.startOfDayForDate(NSDate()), options: [.MatchFirst])

请记住,NSDate 表示独立于任何时区的单个时间点。 NSDate 的默认格式,在调用 -[NSDate description] 时使用,恰好以 UTC 格式设置日期。如果您想使用不同的时区将日期格式化为字符串,您可以使用 NSDateFormatter 并明确设置时区。

关于swift - 如何通过 NSDate 属性过滤 Realm 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36095330/

相关文章:

swift - UICollectionView 未使用自定义 UIViewController 更新

ios - 检查日期是否早于当前日期(Swift)

java - 在 Realm 中执行更新时出错

ios - 如何根据具有自动调整大小的传入数据在 Collection View 单元格中添加随机内容(UIKit 元素)?

swift - 仅当从警报调用时,如何将按钮添加到第二个向下钻取 View Controller ?

swift - NSDate() 或 Date() 显示错误的时间

ios - 如何在Realm Swift中将一对一关系迁移到一对多关系

swift - 将对象添加到 RLMArray

ios - 更改 Swift 中 UIAlertController 上的一个或特定按钮的颜色

objective-c - 减去日期和时间