0

在我的本地数据库中,我保存了一个 NSTimeInterval 值列表。我必须找出并获取给定月份中可用的所有记录。唯一的问题是获取给定月份最后一天的记录似乎不可用。

假设给定月份是 12 月,所以我必须从 12 月 1 日到 12 月 31 日(直到晚上 11:59)获取所有记录

我正在使用以下实现:

[self.dateFormatter setDateFormat:@"dd-MM-yyyy"];
NSDate *startDate = [self.dateFormatter dateFromString:@"1-12-2012"];
NSDate *endDate = [self.dateFormatter dateFromString:@"31-12-2012"];

NSTimeInterval startDateTimeInterval = [startDate timeIntervalSince1970];
NSTimeInterval endDateTimeInterval = [endDate timeIntervalSince1970];

[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"(mdate >= %f) AND (mdate <= %f)",startDateTimeInterval,endDateTimeInterval]];

我注意到,endDateTimeInterval与 31 日(上午 9 点)在数据库中保存的值相比,双精度值要少得多。但是怎么可能,我希望我的 endDateTime 应该到 12 月 31 日晚上 11:59。

请提供您对此问题的意见。

4

2 回答 2

3

NSDate您隐式创建的对象的时间为 00:00。因此谓词搜索将不包括从时间 00:01 到 23:59 的最后一天。最简单的更改是将结束日期设置为第二天(下个月的第一天)并将谓词更改为小于,而不是小于或等于。

[self.dateFormatter setDateFormat:@"dd-MM-yyyy"];
NSDate *startDate = [self.dateFormatter dateFromString:@"1-12-2012"]; // start of range, inclusive
NSDate *endDate = [self.dateFormatter dateFromString:@"1-1-2013"]; // end of range, exclusive
...        
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"(mdate >= %f) AND (mdate < %f)",startDateTimeInterval,endDateTimeInterval]];
于 2012-12-03T17:32:13.870 回答
0

Jason 的回答将解决问题,但我想我已经弄清楚了困惑:虽然在普通英语中,日期通常指定一整天,但在 Cocoa 中,anNSDate是一个确切的时间点。所以它没有长度,完整的描述需要更多的细节,而不仅仅是日/月/年。大多数标准方法都是创建NSDate最接近整秒的报价精度,显然,一旦您转换为“NSTimeInterval”,您通常可以做得更好。

打印 30 是因为在NSLog1 号和 31 号的同一时间之间有 30 天,就像在 1 号和 2 号的同一时间之间有 1 天,而在同一时间和 2 号之间有 0 天第一个和第一个。

因此,Jason 的答案是正确的,因为它应用了“本月第一天开始之后和下个月第一天开始之前”的时间测试。与众不同的是“开始”位。

于 2012-12-03T17:46:53.040 回答