使用日期作为谓词

时间:2017-06-26 03:45:54

标签: objective-c core-data nspredicate

我正在尝试从“今天”创建的核心数据实体中获取所有记录,我在Entity中有一个名为createdDate的字段,该字段使用以下格式的设备的本地timeZone将日期存储为字符串

2017-06-26T11:06:43+08:00

我创建以下日期字符串进行比较:

NSDateFormatter *dateFormatterDayOnly = [[NSDateFormatter alloc] init];
    [dateFormatterDayOnly setDateFormat:@"yyyy-MM-dd"];
    [dateFormatterDayOnly setTimeZone:[NSTimeZone localTimeZone]];

    NSString *todaysDate = [dateFormatterDayOnly stringFromDate:[NSDate date]];

调试告诉我Predicate看起来没问题如下

2017-06-26 11:33:22.277 NWMobileTill[1842:482539] -[EodView tillTotalCashIn] todaysDate:2017-06-26

然后我按如下方式创建谓词

NSPredicate *predicateTodaysDate = [NSPredicate predicateWithFormat:@"createdDate like[cd] %@", todaysDate];

    fetchPts.predicate = predicateTodaysDate;

    NSArray *todaysTendersArray = [[context executeFetchRequest:fetchPts error:&errorPts] mutableCopy];

但这会返回0次点击

我原本预计这会匹配今天创建的所有内容。

我需要更改什么才能返回今天创建的所有记录?

2 个答案:

答案 0 :(得分:2)

而不是like[cd]使用BEGINSWITH

[NSPredicate predicateWithFormat:@"createdDate BEGINSWITH %@", todaysDate];

或正则表达式评估:

NSString* regex = [NSString stringWithFormat:@"^%@.*$", todaysDate];
[NSPredicate predicateWithFormat:@"createdDate MATCHES %@", regex];

答案 1 :(得分:0)

将日期对象存储为字符串错误。这不是一个小错误。不合理的是人们不同意错误。这是完全错误的。

作为一个字符串,你无法比较哪个更大。您无法选择范围。您无法按日期排序。除此之外,您认为字符串会做得更好的一件事 - 将日期显示为字符串 - 也更难!由于本地化,您必须将字符串解析为日期,然后再将其解析为正确的本地化字符串。

如果您还没有发布应用程序,只需更改核心数据模型中的类型,删除应用程序,然后重新安装。确保其他人也删除了应用程序,否则它们会崩溃。

如果您已经发布了应用程序,则创建一个带有ANOTHER属性的新模型版本,并将createdDate作为日期。当应用程序启动时(但不在应用程序委托中 - 因为它可能需要5秒以上,如果确实如此,操作系统将强制退出应用程序)通过数据库并解析所有createdDate字符串并将它们放入createdDate日期字段。

当值为date时进行搜索,获取日期的开始和结束,并搜索两者之间的值。

NSDate* startOfDay = [self.calendar startOfDayForDate:[NSDate date]];
NSDate* endOfDay = [self.calendar dateByAddingUnit:NSCalendarUnitDay value:1 toDate:startOfDay options:0];
NSPredicate *predicate = [NSCompoundPredicate andPredicateWithSubpredicates:@[[NSPredicate predicateWithFormat:@"createdDate > %@", startOfDay],[NSPredicate predicateWithFormat:@"createdDate < %@", endOfDay]]];