ios - 使用 NSPredicate 过滤年/月的 fetchRequest

标签 ios swift3 nsdate nspredicate nsfetchrequest

我有一个应用程序,其中有多个时间条目,其中日期保存为 NSDate。

我想使用获取请求来过滤我从其他地方获得的特定年份和月份。如何使用 NSPredicate 过滤年份和月份?

let predicate = NSPredicate(format: "%K == %D && %K == %D", ???, selectedMonth, ???, selectedYear)

更新

使用 Raki 指出的帮助,我想出了以下代码:

var dateComp = DateComponents()
dateComp.year = Int(selectedYear)
dateComp.month = Int(selectedMonth)
dateComp.day = 1
    
let calendar = Calendar.current
let firstDayOfTheMonth = calendar.date(from: dateComp)
    
var oneMonth = DateComponents()
oneMonth.month = 1
let beginningOfNextMonth = calendar.date(byAdding: oneMonth, to: firstDayOfTheMonth!)

和谓词:

let predicate = NSPredicate(format: "date >= %@ AND date < %@", firstDayOfTheMonth as! CVarArg, beginningOfNextMonth as! CVarArg)

我收到包含以下消息的 SIGABRT:

Could not cast value of type 'Foundation.Date' (0x1073a0ae0) to 'Swift.CVarArg' (0x1196851c8).

Xcode 建议我添加“as!CVarArg”

更新2

以下谓词现在有效:

let predicate = NSPredicate(format: "%K >= %@ && %K < %@", "date", firstDayOfTheMonth! as NSDate, "date", beginningOfNextMonth! as NSDate)

最佳答案

您不能像这样进行谓词,但您可以根据您的月份和年份创建两个日期,分别是该月的开始日和该月的结束日。

现在您需要像这样简单地进行谓词。

let predicate = NSPredicate(format: "%K >= %@ && %K <= %@", "DateAttribute", startDateOfMonth as NSDate, "DateAttribute", endDateOfMonth as NSDate)

编辑:如果您不知道如何为 startDateOfMonthendDateOfMonth 创建日期,则可以使用 创建日期日期组件

let selectedMonth = 11
let selectedYear = 2015
var components = DateComponents()
components.month = selectedMonth
components.year = selectedYear
let startDateOfMonth = Calendar.current.date(from: components)

//Now create endDateOfMonth using startDateOfMonth
components.year = 0
components.month = 1
components.day = -1
let endDateOfMonth = Calendar.current.date(byAdding: components, to: startDate!)

关于ios - 使用 NSPredicate 过滤年/月的 fetchRequest,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42386771/

相关文章:

ios - 如何检查 NSArray 中的 NSDate yyyy/mm/dd 并进行比较?

ios - 如何向 ios UIImage 添加黑色区域

ios - .normal 选项在 UIButton 的状态 OptionSet 中不起作用(Swift 3)

ios - 如何在swift3中用时间减去日期

pdf - 在 UiDocument Picker Swift 3 中仅允许图像和 pdf

swift - 使用 Swift 比较 NSDate

ios - 如何在 Objective c 中获取当前月份的日期?

ios - viewDidLoad : Checking if from a segue?

objective-c - 对象为零,除非我添加另一行 'random' 代码

javascript - 在移动浏览器中测试 Javascript