我正在尝试过滤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'
我该如何解决这个问题?它看起来也像日期和时间值调整到时区。我怎样才能确定日期真的结束了?
答案 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
并明确设置时区。