How to get objects with NSDate today using NSPredicate?

I am stuck in a problem with my Core Data model and query on a select that includes dates.

I have some objects in an object with an NSDate attribute; I need to retrieve objects with today's date , but I always get zero from this code:

public func getObjectsOfToday() -> Array<myObject>?
{
    let entityDescription = NSEntityDescription.entityForName("Objects", inManagedObjectContext: DataAccess.sharedInstance.managedObjectContext)

    let request = NSFetchRequest()
    request.entity = entityDescription
    request.returnsObjectsAsFaults = false

    let today = NSDate()
    request.predicate = NSPredicate(format: "(dateStart => %@) AND (dateStart <= %@)", today, today)

    var objects: [AnyObject]?
    do
    {
        objects = try DataAccess.sharedInstance.managedObjectContext.executeFetchRequest(request)
    }
    catch let error as NSError
    {
        print(error)
        objects = nil
    }

    return objects as? Array<Objects>
}

The problem, I think, is NSPredicate, because it also counts hours, minutes and seconds. If I print today, it is something like:

Printed description of today: 2016-02-28 22:02:01 +0000

but I want the objects to be received with the same date, ignoring hours, minutes and seconds . What should I do?

I also tried to create another NSDate using components:

let components = cal.components([.Day , .Month, .Year ], fromDate: today)
let newDate = cal.dateFromComponents(components)

but the result is the same. What am I doing wrong?

+1
2

, , :

class DateHelper{
    internal class func startOfDay(day: NSDate) -> NSDate {
        let gregorian = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)
        let unitFlags: NSCalendarUnit = [.Minute, .Hour, .Day, .Month, .Year]
        let todayComponents = gregorian!.components(unitFlags, fromDate: day)
        todayComponents.hour = 0
        todayComponents.minute = 0
        return (gregorian?.dateFromComponents(todayComponents))!
    }

    internal class func endOfDay(day: NSDate) -> NSDate {
        let gregorian = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)
        let unitFlags: NSCalendarUnit = [.Minute, .Hour, .Day, .Month, .Year]
        let todayComponents = gregorian!.components(unitFlags, fromDate: day)
        todayComponents.hour = 23
        todayComponents.minute = 59
        return (gregorian?.dateFromComponents(todayComponents))!
    }
}

, :

request.predicate = NSPredicate(format: "(dateStart => %@) AND (dateStart <= %@)", DateHelper.startOfDay(today), DateHelper.endOfDay(today))
+4

, (), , .

var startOfToday: NSDate?
var interval: NSTimeInterval = 0

NSCalendar.currentCalendar().rangeOfUnit(.Day, startDate: &startOfToday, interval: &interval, forDate: NSDate())
let startOfTomorrow = startOfToday!.dateByAddingTimeInterval(interval)

let predicate = NSPredicate(format: "dateStart >= %@ AND dateStart < %@", startOfToday, startOfTomorrow)

import Foundation

let dates:[NSDate] = {
    var dates:[NSDate] = []

    dates.append({
        let c = NSDateComponents()
        c.year = 2016
        c.month = 2
        c.day = 1
        return NSCalendar.currentCalendar().dateFromComponents(c)!
    }())

    dates.append({
        let c = NSDateComponents()
        c.year = 2016
        c.month = 2
        c.day = 3
        return NSCalendar.currentCalendar().dateFromComponents(c)!
        }())

    dates.append({
        let c = NSDateComponents()
        c.year = 2016
        c.month = 3
        c.day = 1
        return NSCalendar.currentCalendar().dateFromComponents(c)!
        }())
    dates.append({
        let c = NSDateComponents()
        c.year = 2016
        c.month = 2
        c.day = 28
        c.hour = 12
        c.minute = 30
        return NSCalendar.currentCalendar().dateFromComponents(c)!
        }())
    dates.append({
        let c = NSDateComponents()
        c.year = 2016
        c.month = 2
        c.day = 28
        c.hour = 11
        c.minute = 15
        return NSCalendar.currentCalendar().dateFromComponents(c)!
        }())
    return dates
}()


var startOfToday: NSDate?
var interval: NSTimeInterval = 0

NSCalendar.currentCalendar().rangeOfUnit(.Day, startDate: &startOfToday, interval: &interval, forDate: NSDate())
if let startOfToday = startOfToday  {

    let startOfTomorrow = startOfToday.dateByAddingTimeInterval(interval)

    let predicate = NSPredicate(format: "self >= %@ AND self < %@", startOfToday, startOfTomorrow)

    let filteredArray = dates.filter({predicate.evaluateWithObject($0)})
    print(filteredArray)
}

:

[2016-02-28 11:30:00 +0000, 2016-02-28 10:15:00 +0000]
+1

Source: https://habr.com/ru/post/1659221/


All Articles