【问题标题】:Filter fetchRequest for year/month using NSPredicate使用 NSPredicate 过滤年/月的 fetchRequest
【发布时间】:2017-07-12 05:22:20
【问题描述】:

我有一个应用程序有多个时间条目,日期保存为 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:

无法将“Foundation.Date”(0x1073a0ae0)类型的值转换为“Swift.CVarArg”(0x1196851c8)。

Xcode 建议我添加“as!CVarArg”

更新 2

以下谓词现在有效:

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

【问题讨论】:

标签: ios swift3 nsdate nspredicate nsfetchrequest


【解决方案1】:

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

现在你需要像这样简单地谓词。

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

编辑:如果您不知道如何为startDateOfMonthendDateOfMonth 创建日期,那么您可以使用DateComponents 创建它。

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!)

【讨论】:

  • 感谢您的帮助。我只是在您打字时自己创建的...:P 但我喜欢 components.day = -1。不知道。
  • @user7259583 现在工作正常吗,你得到想要的结果了吗?
  • @user7259583 检查编辑后的答案并使用谓词类型将Date 转换为NSDate。喜欢startDateOfMonth as NSDate
  • 是的,现在可以了。使用日期而不是 NSDate。感谢您的帮助。
  • @user7259583 如果您想知道它是如何工作的,请阅读此forums.developer.apple.com/thread/60353
猜你喜欢
  • 2013-03-08
  • 2015-07-02
  • 2016-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多