iphone - 两个日期之间的范围的 NSPredicate 没有按预期工作

标签 iphone ios objective-c ipad nspredicate

我有这两个NSDate小号:

NSDateFormatter *df = [[NSDateFormatter alloc] init];
[df setDateFormat:@"MM/dd/yyyy"];
NSDate *rangeStart = [df dateFromString: @"03/03/2013"];
NSDate *rangeEnd = [df dateFromString: @"10/04/2013"];

这个谓词:

request.predicate = [NSPredicate predicateWithFormat:@"createdDate >= %@ AND createdDate <= %@", rangeStart, rangeEnd];

但是即使谓词的第二部分特别使用了 <=它返回直到前一天的对象(即 10/03/2013 )。

我也试过像这样构造谓词:

NSPredicate *dateStartPredicate = [NSPredicate predicateWithFormat:@"createdDate >= %@", rangeStart];
NSPredicate *dateEndPredicate = [NSPredicate predicateWithFormat:@"createdDate <= %@", rangeEnd];
NSPredicate *finalPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:[NSArray arrayWithObjects:dateStartPredicate, dateEndPredicate, nil]]; 

但我得到了相同的结果。难道我做错了什么?这实际上是预期的行为吗?如果是,如何设置 rangeEnd到第二天?

谢谢

最佳答案

NSDate 对象也包含时间。当您将没有时间的日期传递给 dateFromString: 方法时,会假定相应日期的午夜,即只有发生在午夜的项目才会返回 true小于或等于表达式。

常见的解决方法有两种:

  • rangeEnd上加一天,用“小于”代替“小于或等于”,或者
  • 将时间添加到 rangeEnd 日期(这并不理想,因为您要么需要在长字符串中指定时间,要么错过当天最后一秒发生的项目).

这里是如何使用第一种方法:

request.predicate = [NSPredicate
    predicateWithFormat:@"createdDate >= %@ AND createdDate < %@"
    , rangeStart
    , [rangeEnd dateByAddingTimeInterval:60*60*24]
];

关于iphone - 两个日期之间的范围的 NSPredicate 没有按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19171754/

相关文章:

ios - Facebook 无法检索 iPhone 商店 ID?

ios - 获取 sharedApplication' 在我的苹果 watch 应用程序中不可用

iphone - 如何在基于选项卡的应用程序中检查用户 secret ?

ios - 更换开关的按钮

ios - 制作一个 iOS 框架 : including 3rd party libraries and code

ios - 伞架

ios - 即使条件为假,代码也会执行

iphone - 如何实现 map 上位置的雷达 View ?

objective-c - 确定窗口是否可调整大小

objective-c - Objective-C 中的 "Invalid application of ' sizeof ' to interface ' 小数 ' in non-fragile ABI"