【问题标题】:NSTimeInterval seems to be wrong for last day of the given month- iOSNSTimeInterval 在给定月份的最后一天似乎是错误的-iOS
【发布时间】:2012-11-21 03:58:36
【问题描述】:

在我的本地数据库中,我保存了一个 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 double 值与 31 日(上午 9 点)在数据库中保存的值相比要少得多。但是怎么可能,我希望我的 endDateTime 应该是到 12 月 31 日晚上 11:59。

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

【问题讨论】:

  • 我认为您未能提供时间会导致日期在一天的开始。如果你登录(endDateTimeInterval - startDateTimeInterval)/(60.0*60.0*24.0)会发生什么?
  • 日志:30...应该是31吧?
  • 但是为什么它来了 30。不是计算第一天和最后一天时间间隔的正确方法吗?

标签: iphone objective-c nsdate nsdateformatter nstimeinterval


【解决方案1】:

您正在隐式创建的 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]];

【讨论】:

    【解决方案2】:

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

    NSLog 打印 30,因为在每月 1 日和 31 日的同一时间之间有 30 天,就像在 1 日和 2 日的同一时间之间有一整天,而整日为零1 日和 1 日同一时间之间的天数。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-24
      • 2019-05-03
      • 2014-11-21
      • 2016-01-13
      • 1970-01-01
      • 2011-06-06
      相关资源
      最近更新 更多