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

时间:2016-03-18 22:31:22

标签: 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)'")

我收到以下错误:

  

在'TaskList'类型的对象上属性'createdAt'的类型日期的预期对象,但收到:'2015-03-19 21:00:00 +0000'

我该如何解决这个问题?它看起来也像日期和时间值调整到时区。我怎样才能确定日期真的结束了?

1 个答案:

答案 0 :(得分:12)

当前的问题是你使用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并明确设置时区。