iOS開發(fā)關(guān)于時間戳精度問題記錄

關(guān)于時間戳大家并不陌生。最近項目需要持續(xù)獲取更新時間戳。

// 獲取毫秒級時間戳
+(NSString *)getNowTimeTimestamp_millisecond{
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init] ;
    [formatter setDateStyle:NSDateFormatterMediumStyle];
    [formatter setTimeStyle:NSDateFormatterShortStyle];
    [formatter setDateFormat:@"YYYY-MM-dd HH:mm:ss SSS"];
    NSTimeZone* timeZone = [NSTimeZone timeZoneWithName:@"Asia/Shanghai"];
    [formatter setTimeZone:timeZone];
    NSDate *datenow = [NSDate date];
    NSString *timeSp = [NSString stringWithFormat:@"%ld", (long)([datenow timeIntervalSince1970]*1000)];
    return timeSp;
}

我們首選獲取時間戳

 CGFloat time = [[ToolManager getNowTimeTimestamp_millisecond] floatValue];

得到時間戳 :1728895254528
我們校驗一下,沒有問題。


image.png

然后我們創(chuàng)一個最后時間與一個NSTimer

@property (nonatomic, assign)CGFloat lastTime;
@property (nonatomic, strong)NSTimer *yj_Timer;

初始化,每100毫秒執(zhí)行一次(這里不考慮NSTimer的精準,一般情況下也不會遇到精準問題)

    _lastTime = [ToolManager getNowTimeTimestamp_millisecond].floatValue;
    _yj_Timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(timerClicked) userInfo:nil repeats:YES];

做時間對比

-(void)timerClicked{
    CGFloat nowTime = [[ToolManager getNowTimeTimestamp_millisecond] floatValue];
    NSLog(@"時間戳測試 當前時間:%f 最后一次時間:%f",nowTime,_lastTime);
    /// 當最后一次操作與當前時間差,大于1500毫秒后,任務沒有任務在繼續(xù)了
    if (nowTime - _lastTime > 1500){
        // 執(zhí)行后續(xù)操作...
    }
}

問題出現(xiàn)了。在100毫秒的重復下,時間戳竟然是相同的。大概需要等30多秒才能執(zhí)行完畢。到if判斷內(nèi)
這里由于我沒有停止timer,所以一直在輸入日志。


image.png

我們換一種寫法。這里我們不在使用 CGFloat 接收,使用 double

@property (nonatomic, assign)double lastTime;
    NSLog(@"時間戳測試 CGFloat : %f",[ToolManager getNowTimeTimestamp_millisecond].floatValue);
    NSLog(@"時間戳測試 Double : %f",[ToolManager getNowTimeTimestamp_millisecond].doubleValue);
    _lastTime = [ToolManager getNowTimeTimestamp_millisecond].doubleValue;
    _yj_Timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(timerClicked) userInfo:nil repeats:YES];
-(void)timerClicked{
    double nowTime = [[ToolManager getNowTimeTimestamp_millisecond] doubleValue];
    NSLog(@"時間戳測試 當前時間:%f 最后一次時間:%f",nowTime,_lastTime);
    /// 當最后一次操作與當前時間差,大于1500毫秒后,任務沒有任務在繼續(xù)了
    if (nowTime - _lastTime > 1500){
        [_yj_Timer invalidate];
        // 執(zhí)行后續(xù)操作...
    }
}

再來看日志


image.png

這次就可以很明顯看到時間戳的變化了。

對于一個做了8年開發(fā)的我來說,犯了這種低級錯誤實在不應該。
平常我們使用時間戳做格式化不管是float還是double 都沒有問題,問題就出現(xiàn)在持續(xù)獲取的情況下。

本來是個小問題,但是我開始沒想到是這么低級的錯誤,對著GCD的多線程一頓操作,最終發(fā)現(xiàn)了這個問題。??,慚愧啊。
希望我的遭遇可以幫助正在遇到這個問題你。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容