【问题标题】:NSTimeInterval, NSDate & int64_t Yields Unreasonable Time CalculationNSTimeInterval、NSDate 和 int64_t 产生不合理的时间计算
【发布时间】:2014-02-25 14:51:33
【问题描述】:

我正在做的事情应该是一个简单的计算,涉及诸如 int64_t、NSTimeInterval 和 NSDate 之类的东西,以便跟踪令牌的到期时间,该令牌在其获取后一小时内到期并被刷新(换一个新的)每 50 分钟。

我使用的代码大部分时间都有效,但每隔一段时间(例如)它就会计算出自上次令牌交换以来经过的时间是 16,000 天。显然某处有些地方很不对劲,但我只是没有看到。

代码如下:

1) 获取一个新的令牌,它的到期时间以秒为单位给出,直到令牌到期,始终是 3600 秒,或 1 小时。我以秒为单位取这个值,并将其添加到自 1970 年以来以秒为单位的当前时间,并将其作为 int64_t 值存储在核心数据中:

NSTimeInterval secondsSince1970  = [[NSDate date] timeIntervalSince1970];
NSTimeInterval secondsUntilExpirationFrom1970 = secondsSince1970  + [[responseObject objectForKey:@"expires_in"]doubleValue];

account.tokenExp = [self.dataManager updateOAuthTokenExpirationDateForAccount:account tokenExpiration:secondsUntilExpirationFrom1970]; //method that saves to managed object context

2) 现在,每次需要使用令牌时,我都会先查看是否在 10 分钟或 600 秒内过期。如果是,我要求一个新的,如果不是,我不。

- (BOOL)tokenRequiresRefreshForAccount:(Account*)account
{
  NSTimeInterval secondsSince1970 = [[NSDate date] timeIntervalSince1970];
  NSTimeInterval secondsUntilTokenExpiration = account.tokenExp - secondsSince1970;
                  //account.tokenExp is the saved expiration of the token (a double) in core data

  NSLog(@"There are %f minutes until the token expires and we %@ the token.", secondsUntilTokenExpiration / 60, secondsUntilTokenExpiration < 600 ? @"will refresh" : @"will not refresh");

  return secondsUntilTokenExpiration < 600;
}

正如我所说,上述日志最近返回的值等于自上次检查以来已过去 16,000 天,这是在表示距离令牌到期还有 45 分钟的日志后 3 分钟记录的。

如果有人能看到我的错误或有更好的方法来获得相同的结果,我将非常感激。

更新

我看过一些关于“下溢”数字变量的帖子。变量“secondsUntilTokenExpiration”有时是一个相当负数......我是否有可能下溢这个变量?我尝试将其存储为 int64_t 和 NSTimeInterval 并且两者都会偶尔产生(非常)不正确的值。如果这可能是问题所在,我应该如何存储这个值?

【问题讨论】:

  • 在我看来,您可能对从 double 到 int 与显式转换的隐式转换有所了解。 (我很惊讶编译器实际上并没有尖叫血腥谋杀。)

标签: ios objective-c int nsdate nstimeinterval


【解决方案1】:

首先想到的是确保用于派生值的函数调用之一不会降低准确性(NSDate、round、responseObject...)。这有点牵强,但目前我只能看到这些。

【讨论】:

  • 感谢您的建议,我只是尝试删除一些可能会降低准确性但到目前为止没有运气的步骤。
猜你喜欢
  • 2012-12-11
  • 2011-12-19
  • 1970-01-01
  • 2013-08-05
  • 2021-11-25
  • 1970-01-01
  • 1970-01-01
  • 2010-10-31
  • 1970-01-01
相关资源
最近更新 更多