三句話理解時區(qū)與時間戳

從不浪費時間的人,沒有工夫抱怨時間不夠。 —— 杰弗遜

第一句話:時間戳

時間不分東西南北、在地球的每一個角落都是相同的。他們都有一個相同的名字,叫時間戳。時間戳 指的就是Unix時間戳(Unix timestamp)。它也被稱為Unix時間(Unix time)、POSIX時間(POSIX time),是一種時間表示方式,定義為從格林威治時間1970年01月01日00時00分00秒起至現(xiàn)在的總秒數(shù)。

關(guān)于 時間戳, 你可以看在線時間戳

第二句話:時區(qū)

時間戳 在地球的每一個角落都是相同的,但是在相同的時間點會有不同的表達(dá)方式,所以有了另外一個時間概念,叫時區(qū)。這里的時區(qū)地區(qū)不是同一個概念,例如我們所在的時區(qū)東八區(qū)
在設(shè)備中,可以自己手動的切換當(dāng)前的系統(tǒng)時區(qū):

時區(qū)設(shè)置

你會發(fā)現(xiàn):當(dāng)你選在不同的時區(qū),你的當(dāng)前時間是不一樣的。

第三句話:時間戳與時區(qū)在Code中應(yīng)用

一、時間戳 是不會跟著 時區(qū) 的改變而改變

可以用代碼來證明這一點:


- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    
    // 系統(tǒng)時區(qū)
    NSTimeZone* timeZone = [NSTimeZone systemTimeZone];
    NSLog(@"系統(tǒng)當(dāng)前的時區(qū): %@",  timeZone.name);
    
    // 返回的單位是 秒
    NSTimeInterval timeInterval = [[NSDate date] timeIntervalSince1970] ;
    
    NSLog(@"當(dāng)前時間戳:%f", timeInterval);
}

你會發(fā)現(xiàn),不管怎么切換時區(qū),時間戳總是一致??梢詫崟r的參照在線時間戳進(jìn)行驗證。

二、不同 時區(qū) 間的時間切換

這個需求并不是空穴來風(fēng),在很多的app中都會用到的。比如根據(jù)服務(wù)器返回的時間與當(dāng)前時間進(jìn)行一個比較,這里就會有多種可能性,主要體現(xiàn)在服務(wù)器返回時間的方式,比如直接返回一個固定時間的字符串,比如:2017-06-14 22:55:23。然后接口的同事告訴你這個是 東八區(qū) 時間。讓你自己轉(zhuǎn)成當(dāng)前 時區(qū) 的時間。

1、將當(dāng)前 時區(qū) 的時間轉(zhuǎn)成不同 時區(qū) 的時間

不管當(dāng)前設(shè)備的 時區(qū) 在什么地方,都將其轉(zhuǎn)成 東八區(qū) 的時間格式。代碼如下:

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    // 系統(tǒng)時區(qū),默認(rèn)就是當(dāng)前的時區(qū)
    NSTimeZone* timeZone = [NSTimeZone systemTimeZone];
    NSLog(@"系統(tǒng)當(dāng)前的時區(qū): %@",  timeZone.name);
    
    // 獲取當(dāng)前時間
    NSDate* date = [NSDate date];
    
    // 時間格式
    NSDateFormatter * dateFormatter = [[NSDateFormatter alloc]init];
    [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
    
    NSString* now = [dateFormatter stringFromDate:date];
    
    NSLog(@"系統(tǒng)當(dāng)前時間顯示: %@", now);
    
    // 將時區(qū)設(shè)置成 東八區(qū)
    [dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:8*3600]];
    // 設(shè)置后的時間顯示
    now = [dateFormatter stringFromDate:date];
    
    NSLog(@"東八區(qū)的當(dāng)前時間顯示: %@", now);
}

打印結(jié)果如下:

打印完美結(jié)果
2、2017-06-08T11:29:29.209Z

當(dāng)有一天你發(fā)現(xiàn)服務(wù)器返回這樣的時間,請不要束手無策,因為這個時間格式就已經(jīng)明確的將時區(qū)也告訴你了,你只需要這樣做,就能隨時隨地的轉(zhuǎn)成當(dāng)前時區(qū)的時間格式:

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    // 時間字符串 (帶有時區(qū)信息)
    NSString* timeTEXT = @"2017-06-08T11:29:29.209Z";
    // 對應(yīng)時間格式
    NSString* formateTEXT =  @"yyyy-MM-dd'T'HH:mm:ss.SSSZ";
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:formateTEXT];
    
    // 獲取當(dāng)前對應(yīng)時區(qū)的時間
    NSDate* curDate = [dateFormatter dateFromString:timeTEXT];
    
    NSLog(@"對應(yīng)當(dāng)前時區(qū)的時間: %@", curDate);
}

上面的代碼,沒有看到有 時區(qū) 間的切換,但是是正確的。因為timeTEXT已經(jīng)自帶時區(qū) 信息。然而 NSDateFormatter 對象默認(rèn)是當(dāng)前設(shè)備的 時區(qū)。所以 curDate 就是當(dāng)前設(shè)備的時間。

3、想了一下,沒有其它的需要補充了,都太簡單。
謝謝~
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,094評論 25 709
  • Android跨進(jìn)程通信IPC整體內(nèi)容如下 1、Android跨進(jìn)程通信IPC之1——Linux基礎(chǔ)2、Andro...
    隔壁老李頭閱讀 16,042評論 19 113
  • 今天聽李笑來的一個分享,有人問記憶力怎么提高,李笑來說的就是多背多記,就像電腦似的提高自己的內(nèi)存條。還說雖然看起來...
    簡單生活M閱讀 528評論 0 0
  • (一) 初見, 你是人間自由的風(fēng), 看到你突然想要去嘗試風(fēng)與愛情。 (二) 想問你見過櫻花落滿街道的情景嗎? 我見...
    漁陽雨下閱讀 912評論 11 21
  • 你說我對你的事不上心 是不是說我不夠喜歡你 你說你了解我 其實你根本不了解我 我是一個慢熱內(nèi)斂的女孩 即使內(nèi)心有十...
    5e9f2ee6a0ee閱讀 195評論 0 0

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