ale*_*xey 6 nsdate realm swift
我正在尝试过滤Realm对象以查找createdAt日期少于一年前的对象:
let datex = NSCalendar.currentCalendar().startOfDayForDate(NSDate()).dateByAddingTimeInterval(-1*365*24*60*60)
let list = RealmDB.objects(TaskList).filter("createdAt <= '\(datex)'")
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
对于'TaskList'类型的对象上的属性'createdAt'的类型日期的预期对象,但收到:'2015-03-19 21:00:00 +0000'
我该如何解决?它看起来也像日期和时间值调整到时区.我怎样才能确定日期真的是一天的结束?
bda*_*ash 12
当前的问题是你使用Swift的字符串插值来构建谓词而不是使用NSPredicate参数替换.这导致您的谓词类似于:
createdAt <= '2015-03-19 07:00:00 +0000'
Run Code Online (Sandbox Code Playgroud)
这是为了将createdAt日期与字符串文字进行比较.使用NSPredicate的参数替换看起来像:
let list = RealmDB.objects(TaskList).filter("createdAt <= %@", datex)
Run Code Online (Sandbox Code Playgroud)
请注意,面对闰日,闰秒,夏令时导致的不连续性等,您计算日期的方式不正确.您应该使用NSCalendar日期数学的方法,而不是使用魔术常数进行数学运算:
let calendar = NSCalender.currentCalendar()
let datex = calendar.dateByAddingUnit(.Year, value: -1, toDate: calendar.startOfDayForDate(NSDate()), options: [.MatchFirst])
Run Code Online (Sandbox Code Playgroud)
请记住,a NSDate表示单个时间点,与任何时区无关.调用NSDate时使用的默认格式-[NSDate description]恰好以UTC格式化日期.如果您想使用不同的时区将日期格式化为字符串,则可以NSDateFormatter显式使用和设置时区.