iOS內部時鐘

來源:互聯網
上載者:User

iOS內部時鐘
1.什麼是內部時鐘      在我們做iOS開發的過程中,我們經常要與時間打交道,[NSDate date]是我們常用的取時間的一種方式,但是[NSDate date] 這種方式只能取系統的目前時間。也就是說:當前我們手機的時間是什麼時間,取出來的值,就是多少。     如果使用者把系統的時間改了呢?那麼[NSDate date]取出來的值,還是我們想要的嗎???在一些應用的開發中,我們在沒有網路的狀態下,不能取網路時間,依靠系統時間,是可以篡改的。所以這個時候,我們要自己要在程式的內部定製一個自己的內部時鐘。   2.實現內部時鐘的思路     1.要有一個時間作為基本的參照點(一般應用都會與伺服器打交道,所以發請求給伺服器,取伺服器的時間是比較合適的)     2.要有一個標記點(一般取待機時間長度)     3.在每次進入程式的時候,或者登入的時候,取伺服器的時間存起來,然後再取當前的待機時間存起來,每次要擷取目前時間的時候,再取待機時間長度跟之前的儲存的待機時間長度比較,獲得差值。將儲存的伺服器時間加上差值,就獲得想要的目前時間。   3.具體實現步驟    0.用到的宏:  

//開機時間#define SWStartTime  @"startTime"//伺服器時間#define SWServerTime @"serverTime"//登入時的待機時間長度#define SWSinceNow @"sinceNow"

 

     1.擷取待機時間長度  
<br>/** *  待機時間(從系統啟動的那一刻開始擷取的時間間隔) */+ (time_t)uptime{    struct timeval boottime;         int mib[2] = {CTL_KERN, KERN_BOOTTIME};         size_t size = sizeof(boottime);         time_t now;         time_t uptime = -1;         (void)time(&now);         if (sysctl(mib, 2, &boottime, &size, NULL, 0) != -1 && boottime.tv_sec != 0)             {                 uptime = now - boottime.tv_sec;             }         return uptime;     }

 

  2.儲存伺服器時間及待機時間長度  
/** *  儲存伺服器時間及待機時間長度 * *  @param serverTime 伺服器時間 */+ (void)firstTimeWithLogin:(NSString *)serverTime{        NSTimeInterval timer = (NSTimeInterval)[self uptime];        NSString *sinceNow = [NSString stringWithFormat:@"%f",timer];                 NSUserDefaults *UserDefaults = [NSUserDefaults standardUserDefaults];        //儲存登入時擷取的伺服器時間        [UserDefaults setObject:serverTime forKey:SWServerTime];        //儲存登入時擷取的待機時間長度        [UserDefaults setObject:sinceNow forKey:SWSinceNow];    }

 

  3.獲得當前的時間(以伺服器時間為基準) 
+ (NSDate *)dateOfNow{    NSDateFormatter *formatter = [[NSDateFormatter alloc]init];    [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];         NSUserDefaults *UserDefaults = [NSUserDefaults standardUserDefaults];    //取出登入時擷取的伺服器時間    NSString * serverText = [UserDefaults objectForKey:SWServerTime];    NSDate *FirstServer = [formatter dateFromString:serverText];         NSString *firstText = [UserDefaults objectForKey:SWSinceNow];    CGFloat first = firstText.floatValue;    NSTimeInterval timer = (NSTimeInterval)[self uptime];         CGFloat second = (CGFloat)timer;         //差值    CGFloat finaly = second - first;    NSTimeInterval interval = (NSTimeInterval)finaly;         //最後的時間    NSDate *finalyDate = [FirstServer dateByAddingTimeInterval:interval];    return finalyDate;}

 

 4.深度探討    為什麼擷取待機時間不用SystemUptime這種方法?答案 :SystemUptime這種擷取待機時間的方式在我們裝置深度睡眠的時候,擷取的值會有誤差,而上面我所用的方法不會。親測!!!    如果我要擷取手機的開機時間,怎麼辦?答案 :   
/** *  獲得開機時間 */+ (NSString *)getUpTime{    NSString * proc_useTiem;    int mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_PID, 0};    size_t miblen = 4;    size_t size;    //返回0,成功;返回-1,失敗    int st = sysctl(mib, miblen, NULL, &size, NULL, 0);        struct kinfo_proc * process = NULL;    struct kinfo_proc * newprocess = NULL;    do    {        size += size / 10;        newprocess = realloc(process, size);        if (!newprocess)        {            if (process)            {                free(process);                process = NULL;            }            return nil;        }        process = newprocess;        st = sysctl(mib, miblen, process, &size, NULL, 0);            }    while (st == -1 && errno == ENOMEM);    if (st == 0)    {        if (size % sizeof(struct kinfo_proc) == 0)        {            int nprocess = size / sizeof(struct kinfo_proc);            if (nprocess)            {                for (int i = nprocess - 1; i >= 0; i--)                {                    @autoreleasepool{                                                //進程的時間                        double t = process->kp_proc.p_un.__p_starttime.tv_sec;                        double s = process->kp_proc.p_un.__p_starttime.tv_usec;                        double finaly = t + s *0.000001;                        //將其轉為具體時間                        proc_useTiem = [self timeWithBoot:finaly];                    }                                    }                free(process);                process = NULL;                return proc_useTiem;                            }        }    }    return nil;}

 

  
/** *  轉為具體時間 */+ (NSString *)timeWithBoot:(double)interval{    NSDateFormatter *format = [[NSDateFormatter alloc]init];    format.timeZone = [NSTimeZone timeZoneWithName:@"shanghai"];    [format setDateStyle:NSDateFormatterMediumStyle];    [format setTimeStyle:NSDateFormatterShortStyle];    //注意先後順序    [format setDateFormat:@"yyyy-MM-dd HH:mm:ss.SSS"];    NSDate *date = [NSDate dateWithTimeIntervalSince1970:interval];    NSString *bootTime = [format stringFromDate:date];    return bootTime;}

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.