1. 程式人生 > >iOS倒計時,顯示剩餘天、時、分、秒

iOS倒計時,顯示剩餘天、時、分、秒

iOS倒計時的實現,顯示剩餘天、時、分、秒

做專案中經常會遇到秒殺、搶商品啊等等。那麼這個十分秒的倒數是如何程式碼實現的呢!

通常後臺會給我們一個時間戳活著截至日期(deadLine)。那麼無論是時間戳還是一個具體的日期時間點,我們的處理邏輯都是這樣的。統一處理成NSDate物件,那麼就起名叫做endDate吧。我們還有一個開始時間,就是當前時間,命名為startDate。

我們要取到endDate和startDate的間隔有多久,有多長的時間間隔。那麼廢話少說,開始看程式碼,這樣更清晰。 
//結束時間 
detailedDict[@”endTime”]為服務端返回的資料。 
NSDateFormatter *dateFormatter=[[NSDateFormatter alloc] init]; 
if ([detailedDict[@”endTime”] length]==10) { 
[dateFormatter setDateFormat:@”yyyy-MM-dd”]; 
}else{ 
[dateFormatter setDateFormat:@”yyyy-MM-dd HH:mm:ss”]; 

// NSDate *endDate = [dateFormatter dateFromString:detailedDict[@”endTime”]];

NSDate *endDate = [dateFormatter dateFromString:@”2016-02-20”]; 
那麼這裡注意了,如果後臺給你的是這樣的具體日期,那麼我們還要多加一天的時間,畢竟要倒計時到 2016-02-20日的深夜0:00啊,下一秒就是2016-02-21日了。如果後臺給的是時間戳,那麼不用多加一天,因為時間戳就是個具體的時間點。 
NSDate *endDate_tomorrow = [[NSDate alloc] initWithTimeIntervalSinceReferenceDate:([endDate timeIntervalSinceReferenceDate] + 24*3600)]; 
//當前時間 
NSDate *startDate = [NSDate date]; 
//得到相差秒數

NSTimeInterval timeInterval =[endDate_tomorrow timeIntervalSinceDate:startDate];

下面處理UI顯示的邏輯 
if (timeInterval==0) { 
detailCell.yzImageView.hidden = NO; 
過期了,倒計時結束了 
}else{ 
detailCell.yzImageView.hidden = YES; 
沒過期, 倒計時還會繼續 

這裡用到這個 dispatch_source_t _timer; 
把timer定義為全域性的。

if (_timer==nil) {
                __block int timeout = timeInterval; //倒計時時間

                if (timeout!=0) {
                    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
                    _timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0,queue);
                    dispatch_source_set_timer(_timer,dispatch_walltime(NULL, 0),1.0*NSEC_PER_SEC, 0); //每秒執行
                    dispatch_source_set_event_handler(_timer, ^{
                        if(timeout<=0){ //倒計時結束,關閉
                            dispatch_source_cancel(_timer);
                            _timer = nil;
                            dispatch_async(dispatch_get_main_queue(), ^{
                                detailCell.dayLabel.text = @"";
                                detailCell.hourLabel.text = @"00";
                                detailCell.minuteLabel.text = @"00";
                                detailCell.secondLabel.text = @"00";
                                detailCell.yzImageView.hidden = NO;
                            });
                        }else{
                            int days = (int)(timeout/(3600*24));
                            if (days==0) {
                                detailCell.dayLabel.text = @"";
                            }
                            int hours = (int)((timeout-days*24*3600)/3600);
                            int minute = (int)(timeout-days*24*3600-hours*3600)/60;
                            int second = timeout-days*24*3600-hours*3600-minute*60;
                            dispatch_async(dispatch_get_main_queue(), ^{
                                if (days==0) {
                                    detailCell.dayLabel.text = @"";
                                }else{
                                    detailCell.dayLabel.text = [NSString stringWithFormat:@"%d天",days];
                                }
                                if (hours<10) {
                                    detailCell.hourLabel.text = [NSString stringWithFormat:@"0%d",hours];
                                }else{
                                    detailCell.hourLabel.text = [NSString stringWithFormat:@"%d",hours];
                                }
                                if (minute<10) {
                                    detailCell.minuteLabel.text = [NSString stringWithFormat:@"0%d",minute];
                                }else{
                                    detailCell.minuteLabel.text = [NSString stringWithFormat:@"%d",minute];
                                }
                                if (second<10) {
                                    detailCell.secondLabel.text = [NSString stringWithFormat:@"0%d",second];
                                }else{
                                    detailCell.secondLabel.text = [NSString stringWithFormat:@"%d",second];
                                }

                            });
                            timeout--;
                        }
                    });
                    dispatch_resume(_timer);
                }
            }

相關推薦

iOS倒計時顯示剩餘

iOS倒計時的實現,顯示剩餘天、時、分、秒 做專案中經常會遇到秒殺、搶商品啊等等。那麼這個十分秒的倒數是如何程式碼實現的呢! 通常後臺會給我們一個時間戳活著截至日期(deadLine)。那麼無論是時間戳還是一個具體的日期時間點,我們的處理邏輯都是這樣的。統一處理成N

js根據當前時間和結束時間做倒計時(還有XXXXXXXXXXXX

js根據當前時間和結束時間做倒計時(還有XXX天XXX時XXX分XXX秒),當天,不需要XXX天數,剩餘0小時,不需要顯示XXX時,剩餘0分鐘,不需要顯示XXX分 1. js方法 2. HTML程式碼 1. js方法 /*

iOS -XXxxxxxx部分改變顏色和字型大小

這個就是一個簡單的NSString改變為NSAttributedString後 對字串進行rang查詢和顏色替換。 直接上程式碼。 - (NSAttributedString *)transfor

時間()轉時間字串(xxxx

前言 通常為了直觀表現時間會把時間數字轉成時間字串 eg: 輸入時間(秒):123456 輸出時間字串:1天10小時17分鐘36秒 直接上程式碼 public class NumToDateString { public static void main

JS 將轉為xxxx

/* *@param s : 時間秒 */ function secondsFormat( s ) { var day = Math.floor( s/ (24*3600) ); // Math.floor()向下取整 var h

moment獲取的235959可以用moment().endOf(String)以及獲取的000可以用moment().startOf('day')

-c att In string com sta sin nbsp monday 資料來源:https://segmentfault.com/a/1190000010045286 moment獲取天的23時59分59秒可以用moment().endOf(String

Js中Date日期的使用(加一加一個月獲取000235959等)

程式碼示例如下:(以當前日期new Date()為例。也可以將例中new Date()換成任意Date物件)1.獲取今天的0時0分0秒(常用於開始日期的獲取)var startDate= new Date(new Date().toLocaleDateString()); /

訊號與系統學習之第一章(系統的六大基本性質定義與判別:無記憶性可逆性因果性穩定性不變性線性)

本人現在大三,由於準備明天研究生考試,故重新學習複習《訊號與系統》, 再接下來會將自己的一些學習經歷、知識總結與大家分享。對於有所紕漏的地方 希望大家能幫助指出以一同進步。 對於第一章,顯然其重中之重便是系統的六大基本性質,那麼接下來我會以官方解釋及自身的理解加上例題、易錯題、及後面

java 計算時間差還剩下xxxx小時xxxx

計算時間差,還剩下xx天xx小時xx分xx秒 使用: final Handler handler = new Handler(); Runnable runnable = new

數 [整數型] 匹配成 xx xxxx

    /**      * 將秒數 匹配成 xx時 xx分xx秒      *      * @param time      * @return  

獲取當天000的時間戳 獲取當月的天數 js

initDateRange () { const end = new Date(new Date(new Date().toLocaleDateString()).getTime() + 24 * 60 * 60 * 1000 - 1) const start = new

go 獲得當天000時間戳

t := time.Now() tm1 := time.Date(t.Year(), t.Month(), t.Day(), 0, 0, 0, 0, t.Location()) tm2 := t

SQL中得到兩個日期之間相隔 xxxx小時xxxx

SQL SERVER中可以這麼做: DECLARE @dt1 AS datetime, @dt2 AS datetime; SELECT @dt1 = '2008-8-4 9:36:41', @dt2 = '2008-8-2 9:33:39'; DECLARE @Days

js 兩個時間戳之間怎麼計算相隔多少多少小時多少多少

/** * 計算時間戳之間的差值 * * @param start_time 開始時間戳 * @param end_time 結束時間戳 */function calculateDiffTime(start_time, end_time){ var startTime = 0, endTi

網頁顯示時間分秒轉化倒計時原理

                                            <script type="text/javascript"> //倒計時原理 = 未來時間點-現在時間點 //var iNow = new Date();/

js倒計時-- 到時間後自動停止

js倒計時–天、時、分、秒, 到時間後自動停止: <!DOCTYPE html> <html lang="en"> <head> <meta ch

ios UIWebView載入本地htmlhtml樣式圖片顯示出來

將h5檔案拖到專案中 選擇彈出框Added folders的Create folder references選擇 然後載入 例如 NSURL *url = [NSURL URLWithString:[[NSString stringWithFormat:@““] stringByAddi

iOS開發-顯示傳送時間(幾分鐘前幾小時前前)

+ (NSString *) compareCurrentTime:(NSString *)str { //把字串轉為NSdate NSDateFormatter *dateForm

java程式碼計算時間差精確到 毫秒

/** * 兩個時間相差距離多少天多少小時多少分多少秒 * @param strTime1 時間引數 1 格式:2016-06-22 18:21:20 * @param strTime2 時間引數 2 格式:2016-06-22 17:21:2

iOS 使用MBProgressHUD顯示禁止使用者互動方法

MBProgressHUD *hud; //有文字 hud = [MBProgressHUD showHUDAddedTo:waitView animated:YES]; hud.userInterac