從不浪費時間的人,沒有工夫抱怨時間不夠讹语。 —— 杰弗遜
第一句話:時間戳
時間不分東西南北吊洼、在地球的每一個角落都是相同的蓖捶。他們都有一個相同的名字,叫時間戳军援。時間戳 指的就是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ū):
你會發(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ū),時間戳總是一致闸翅≡儆螅可以實時的參照在線時間戳進(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é)果如下:
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è)備的時間舌劳。