ios - 使用核心数据 ios swift 在两个日期之间获取记录

标签 ios swift core-data nsdate nspredicate

我正在尝试快速搜索两个日期之间的记录。 我正在存储日期,如下所示:

     let date = NSDate()
     let dateFormatter = NSDateFormatter()
     dateFormatter.dateFormat = "yyyy'-'MM'-'dd HH':'mm':'ss"

     println(date) // prints 2015-09-26 05:22:41 +0000

     myreport.setValue(date, forKey: "date")

下面是我使用 NSPredicate 获取两个日期之间的记录的代码:

    let dateFormatter = NSDateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd"

    let startDate:NSDate = dateFormatter.dateFromString(fromdate)!
    let endDate:NSDate = dateFormatter.dateFromString(todate)!

    println(fromdate) // prints 2015-09-22
    println(todate)  // prints 2015-09-29
    println(startDate) // prints 2015-09-21 20:00:00 +0000
    println(endDate)  // prints 2015-09-28 20:00:00 +0000
    let predicate1 = NSPredicate(format: "%@ >= date AND %@ <= date", argumentArray: [startDate, endDate])

    let predicate = NSCompoundPredicate(type: NSCompoundPredicateType.OrPredicateType, subpredicates: [predicate1])
    // Set the predicate on the fetch request
    request.predicate = predicate
    request.sortDescriptors = [NSSortDescriptor(key: "report_id", ascending: false)]
    var results : NSArray = context.executeFetchRequest(request, error: nil)!

注意:

1) 我的开始日期和结束日期采用这种格式 2015-09-25(作为字符串)

2)我在core data中date属性的数据类型是NSDate

3) 我能够成功地从核心数据中存储和获取日期

当我运行上面的代码时,我没有收到任何错误,但是代码没有搜索两个日期之间的记录。我的意思是我得到的是空结果数组。

谁能告诉我我在这里做错了什么。 另外请让我知道是否需要更多信息。提前致谢!

最佳答案

经过多次修改和测试后,终于对我有用了,如下所示。如果您需要我如何将 nsdate 存储在 coredata 中,请检查上面的问题。

    println(self.appdel.fromdate) // prints 2015-09-25
    println(self.appdel.todate) // prints 2015-09-26

    var fromdate = "\(self.appdel.fromdate) 00:00" // add hours and mins to fromdate 
    var todate = "\(self.appdel.todate) 23:59" // add hours and mins to todate

    var context : NSManagedObjectContext = appdel.managedObjectContext!
    var request = NSFetchRequest(entityName: "TblReportsP")
    request.returnsObjectsAsFaults = false
    let dateFormatter = NSDateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd HH:mm"
    dateFormatter.timeZone = NSTimeZone(name: "GMT") // this line resolved me the issue of getting one day less than the selected date
    let startDate:NSDate = dateFormatter.dateFromString(fromdate)!
    let endDate:NSDate = dateFormatter.dateFromString(todate)!
    request.predicate = NSPredicate(format: "(date >= %@) AND (date <= %@)", startDate, endDate)

    request.sortDescriptors = [NSSortDescriptor(key: "report_id", ascending: false)]
    var results : NSArray = context.executeFetchRequest(request, error: nil)!

    println(results.count)

关于ios - 使用核心数据 ios swift 在两个日期之间获取记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32781558/

相关文章:

swift - 在 Swift Storyboards for mac 中从一个 NSViewController 切换到另一个 NSViewController

macos - 如何在 NSPersistentDocument 中预加载 Core Data 中的数据?

cocoa - 如何使菜单栏项显示表格中有多少行?

ios - 在 iOS 和自动布局中以编程方式创建 UI?

IOS 13 自动化要求运行

ios - 搜索栏动画

ios - 核心数据父实体

javascript - iOS 停止随机发送 httprequests[Titanium]

ios - 展开可选值时意外发现 nil - 使用 ALAMOFIRE

ios - Swift:使用 tableview 创建无限树