timeIntervalSinceNow返回随机数

时间:2010-07-16 15:46:38

标签: iphone objective-c cocoa-touch

timeInterval不断返回随机数。我认为每次通话时间隔会继续增加,但有时候会得到负数,有时会得到正数。

NSDate *date = groceryItem.lastPurchased;
double timeInterval = [date timeIntervalSinceNow];
cell.detailTextLabel.text = [NSString stringWithFormat:@"%d", timeInterval];

7 个答案:

答案 0 :(得分:11)

%d表示整数,使用%f表示双重

[NSString stringWithFormat:@"%f", timeInterval];

答案 1 :(得分:11)

请改为尝试:

NSTimeInterval timeInterval = [[NSDate date] timeIntervalSinceDate:groceryItem.lastPurchased];
cell.detailTextLabel.text = [NSString stringWithFormat:@"%f", timeInterval];

这个片段的几点:

  1. 我在第二行使用了NSTimeInterval而不是double。它们是等价的,因为它只是一个typedef,但它可以使代码更清晰。
  2. 我不是从过去的某个日期获取时间间隔,而是使用[NSDate date]计算日期和时间,并从groceryItem.lastPurchased获取时间间隔。只要groceryItem.lastPurchased过去,这将返回一个正数。
  3. 我已编辑原始代码,直接将groceryItem.lastPurchased传递给时间间隔计算。为仅使用一次的项声明变量并不总是一个好主意,尤其是在非垃圾收集环境中。尽管声明变量可能会使代码更具可读性,但还有其他方法可以提高可读性。例如,在这种情况下,将属性更改为groceryItem.lastPurchasedDate,这使得它更加清晰。

答案 2 :(得分:7)

如果接收器早于当前日期和时间,则返回值为负。因此,如果date之前之前,则为负数。

答案 3 :(得分:6)

timeIntervalSinceNow将返回接收者与当前日期和时间之间的间隔。如果接收器早于当前日期和时间,则返回值为负。如果接收方晚于当前日期和时间,则返回值为正。

希望这有帮助。

答案 4 :(得分:3)

此代码[NSString stringWithFormat:@"%d", timeInterval];错误。这是一个双重的。不要使用%d。请改用%f。

[NSString stringWithFormat:@"%f", timeInterval];

答案 5 :(得分:2)

上面已经正确回答了,我还补充说你应该使用NSTimeInterval类型而不是双倍。

答案 6 :(得分:1)

您应该使用下面的负号

double timeInterval = - [date timeIntervalSinceNow];