确定NSDate目前是否在NSPredicate中

问题描述 投票:3回答:6

我已经尝试了多种方法,并在这个网站上尝试了一些建议,但我如何确定CoreData属性“dueDate”是否等于“今天”,我知道NSDate也是一个特定的时间,但我希望谓词返回无论白天是什么时间,它都是同一天/月/年。有什么建议?

ios objective-c core-data nsdate nspredicate
6个回答
3
投票

这就是我想出的:

- (NSPredicate *)matchAttribute:(NSString *)attributeName withDate:(NSDate *)date
{
    NSDateComponents *components = [[NSCalendar currentCalendar] components:NSYearCalendarUnit | NSMonthCalendarUnit |  NSDayCalendarUnit fromDate:date];
    NSDateComponents *oneDay = [[NSDateComponents alloc] init];
    oneDay.day = 1;

    NSDate *lastMidnight = [[NSCalendar currentCalendar] dateFromComponents:components];
    NSDate *nextMidnight = [[NSCalendar currentCalendar] dateByAddingComponents:oneDay toDate:lastMidnight options:NSWrapCalendarComponents];

    return [NSPredicate predicateWithFormat:@"(%K >= %@) AND (%K <= %@)", attributeName, lastMidnight, attributeName, nextMidnight];
}

来自hereherehere的灵感。


2
投票

通过使用NSDateComonents和NSCalendar修复此问题。

刚刚从原始NSDate创建了日/月/年的NSDateComponents,然后使用dateFromComponents将其重新创建为日期。

这导致它成为一天的开始,然后我使用上面的方法创建另一个日期,这是“明天”的开始并使用>和<以查看它是否“今天”。无论如何,谢谢你的帮助。


1
投票

今天的概念很棘手,因为你的意思是什么?这就是为什么它不简单。你的意思是在同一天,一个月和一年,不管时区如何?你的意思是在同一个24小时内吗?在过去的24小时内?它会变得复杂。

您对上述内容的回答决定了您问题的答案。如果是同一天,月和年,则使用NSDateComponents提取这三个值并进行比较。如果您的意思是在24小时内,那么您可以使用日期方法-timeIntervalSinceDate:来确定日期之间的秒数。

如果你的意思是其他的话请澄清。


1
投票

快速回答

我使用AFDateHelper如果你不想使用第三方。只需检查源代码,找到dateAtStartOfDay()dateAtEndOfDay()的实现

然后它轻而易举。

NSPredicate(format: "pickup_time > %@ && pickup_time < %@",NSDate().dateAtStartOfDay(),NSDate().dateAtEndOfDay())


0
投票

你可能想尝试一些事情。

  1. 向您的实体添加另一个整数属性dueDateYYYMMDD。使用NSDateFormatter将NSDate转换为YYYYMMDD字符串,然后使用NSString integerValue生成dueDateYYYYMMDD。
  2. 在[NSDate date]上使用NSDateFormatter以YYYYMMDD格式生成“today”,并使用[NSString integerValue]生成“today”作为整数(todayInt)。现在可以很容易地构造谓词来比较dueDateYYYYMMDD == todayInt。

整数值的比较比字符串更有效。


0
投票

您可能会发现Erica Sadun NSDate实用程序对此类有用。

很多很方便的点点滴滴。看看这个。

https://github.com/erica/NSDate-Extensions

马特

© www.soinside.com 2019 - 2024. All rights reserved.