簡體   English   中英

NSTimeInterval,NSDate和int64_t產生不合理的時間計算

[英]NSTimeInterval, NSDate & int64_t Yields Unreasonable Time Calculation

我在做什么應該涉及之類的東西的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天,該值在日志中說3分鍾后才記錄,直到令牌到期為止還有45分鍾。

如果有人能看到我的錯誤或有更好的方法來獲得相同的結果,我將不勝感激。

更新

我看過一些有關“下溢”數字變量的文章。 變量“ secondsUntilTokenExpiration”有時是一個相當負的數字...我是否有可能在此變量下溢? 我嘗試將其存儲為int64_t和NSTimeInterval,並且兩者都偶爾(非常)產生不正確的值。 如果這可能是問題,我應該如何存儲該值?

首先想到的是確保用於導出值的函數調用中的一個不會降低精度(NSDate,Round,responseObject ...)。 這有點費力,但這就是我目前能看到的全部。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM