【问题标题】:NSFetchRequest by dateNSFetchRequest 按日期
【发布时间】:2015-08-03 08:41:52
【问题描述】:

我有下面的方法,我通过 NSDate() 来获取今天的所有结果。我试图在午夜到午夜得到结果,但它似乎不起作用。我注意到我的谓词输出如下:

"date >= CAST(460249200.000000, "NSDate") AND date

func GetAll(dayOfRecords: NSDate) -> NSArray {


    var calendar = NSCalendar.currentCalendar()
    var components = calendar.components(.CalendarUnitMonth | .CalendarUnitDay | .CalendarUnitYear, fromDate: dayOfRecords);
    var midnightComponents = NSDateComponents();
    midnightComponents.day = components.day;
    midnightComponents.month = components.month;
    midnightComponents.year = 2015;
    midnightComponents.hour = 0;

    var midnightDate = calendar.dateFromComponents(midnightComponents);

    var twentyFourHoursLater = NSDateComponents();
    twentyFourHoursLater.day = components.day;
    twentyFourHoursLater.month = components.month;
    twentyFourHoursLater.year = 2015;
    twentyFourHoursLater.hour = 11;
    twentyFourHoursLater.minute = 59;

    var twentyFourHoursAhead = calendar.dateFromComponents(twentyFourHoursLater);


    var predicate = NSPredicate(format: "(date >= %@) AND (date <= %@)", midnightDate!, twentyFourHoursAhead!);
    var fetchRequest = NSFetchRequest(entityName: "Movement")
    //filter seems to get 1987!!!??? fetchRequest.predicate = predicate;
    fetchRequest.predicate = predicate;
    var results:NSArray = managedObjectContext!.executeFetchRequest(fetchRequest, error: nil)!

    return results;
}

【问题讨论】:

    标签: swift core-data xcode6


    【解决方案1】:

    对于 Date 属性,Core Data 存储自以来的秒数 2001 年 1 月 1 日,SQLite 数据库中的 GMT,即NSDate 属性timeIntervalSinceReferenceDate 返回。

    let date = NSDate(timeIntervalSinceReferenceDate: 460249200.0)
    

    您可以验证 SQLite 查询中的第一个时间戳是 2015-08-02 23:00:00 +0000,即2015-08-03 00:00:00 GMT+1 时区。

    因此,您的开始日期正确设置为 8 月 3 日午夜。 然而,结束日期设置为同一天的 11:59,即 (大约)中午而不是 24 小时后。你可能想设置它 到 23:59,或者最好到第二天的 00:00。

    这可以简化为

    let calendar = NSCalendar.currentCalendar()
    let startDate = calendar.startOfDayForDate(dayOfRecords)
    let endDate = calendar.dateByAddingUnit(.CalendarUnitDay, value: 1, toDate: startDate, options: nil)!
    
    let predicate = NSPredicate(format: "(date >= %@) AND (date < %@)", startDate, endDate);
    

    【讨论】:

      猜你喜欢
      • 2013-06-01
      • 2023-03-14
      • 2020-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-24
      相关资源
      最近更新 更多