Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 今日核心数据谓词过滤器';日期_Swift_Core Data_Swift3_Nspredicate - Fatal编程技术网

Swift 今日核心数据谓词过滤器';日期

Swift 今日核心数据谓词过滤器';日期,swift,core-data,swift3,nspredicate,Swift,Core Data,Swift3,Nspredicate,我对此有疑问,但我还没有找到正确的答案,所以我将在这里留下一个小教程 目标是按今天的日期筛选获取的对象 注意:它与Swift 3兼容。您不能简单地用它来比较您的日期和今天的日期: let today = Date() let datePredicate = NSPredicate(format: "%K == %@", #keyPath(ModelType.date), today) 它不会显示任何内容,因为您的日期不太可能是精确的比较日期(它也包括秒和毫秒) 解决办法是: // Get th

我对此有疑问,但我还没有找到正确的答案,所以我将在这里留下一个小教程

目标是按今天的日期筛选获取的对象


注意:它与Swift 3兼容。

您不能简单地用它来比较您的日期和今天的日期:

let today = Date()
let datePredicate = NSPredicate(format: "%K == %@", #keyPath(ModelType.date), today)
它不会显示任何内容,因为您的日期不太可能是精确的比较日期(它也包括秒和毫秒)

解决办法是:

// Get the current calendar with local time zone
var calendar = Calendar.current
calendar.timeZone = NSTimeZone.local

// Get today's beginning & end
let dateFrom = calendar.startOfDay(for: Date()) // eg. 2016-10-10 00:00:00
let dateTo = calendar.date(byAdding: .day, value: 1, to: dateFrom)
// Note: Times are printed in UTC. Depending on where you live it won't print 00:00:00 but it will work with UTC times which can be converted to local time

// Set predicate as date being today's date
let fromPredicate = NSPredicate(format: "%@ >= %@", date as NSDate, dateFrom as NSDate)
let toPredicate = NSPredicate(format: "%@ < %@", date as NSDate, dateTo as NSDate)
let datePredicate = NSCompoundPredicate(andPredicateWithSubpredicates: [fromPredicate, toPredicate])
fetchRequest.predicate = datePredicate
//获取带有本地时区的当前日历
var calendar=calendar.current
calendar.timeZone=NSTimeZone.local
//了解今天的开始和结束
让dateFrom=calendar.startOfDay(for:Date())//例如2016-10-10 00:00:00
让dateTo=calendar.date(通过添加:.day,值:1,to:dateFrom)
//注意:时间以UTC打印。根据您居住的地方,它不会打印00:00:00,但会使用UTC时间,可以转换为当地时间
//将谓词设置为日期为今天的日期
让fromPredicate=NSPredicate(格式:“%@>=%@”,日期为NSDate,日期从为NSDate)
让toPredicate=NSPredicate(格式:“%@<%@”,日期为NSDate,日期为NSDate)
let datePredicate=NSCompoundPredicate(和PredicateWithSubPredicates:[fromPredicate,TopPredicate])
fetchRequest.predicate=datePredicate

这是迄今为止只显示具有今天日期的对象的最简单和最短的方法。

在swift4中,Lawrence413可以简化一点:

//Get today's beginning & end
let dateFrom = calendar.startOfDay(for: Date()) // eg. 2016-10-10 00:00:00
let dateTo = calendar.date(byAdding: .day, value: 1, to: dateFrom)


它去掉了
组件
部分,使代码具有更好的可读性。

可能有助于在Lawrence413的回答中添加以下内容:要过滤包含今天日期的属性的记录列表,可以使用:

让fromPredicate=NSPredicate(格式:“datetime>=%@”,dateFrom作为NSDate)

让toPredicate=NSPredicate(格式:“datetime<%@”,dateToUnrapped为NSDate)
不要将86400秒用作一天的持续时间(考虑夏令时转换)。使用正确的日历方法。将两个日期作为数组传递是错误的,请尝试并打印谓词!您的第一个示例
NSPredicate(格式:“date==date()”)
实际上会崩溃。是的,86400秒是一个基本实现。我会用更好的解决方案更新答案。谢谢你的阵列提醒。可以传递参数数组。使用更新后的函数,代码运行正常。fetchRequest在哪里?如果我们想添加24小时,该怎么办?不适用于day.Pre-Swift 3此处的问题和答案:。我认为@lawrence413正在为Swift 3寻找解决方案。