關(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)了這個問題。??,慚愧啊。
希望我的遭遇可以幫助正在遇到這個問題你。