從不浪費時間的人,沒有工夫抱怨時間不夠。 —— 杰弗遜
第一句話:時間戳
時間不分東西南北、在地球的每一個角落都是相同的。他們都有一個相同的名字,叫時間戳。時間戳 指的就是Unix時間戳(Unix timestamp)。它也被稱為Unix時間(Unix time)、POSIX時間(POSIX time),是一種時間表示方式,定義為從格林威治時間1970年01月01日00時00分00秒起至現在的總秒數。
關于 時間戳, 你可以看在線時間戳
第二句話:時區
時間戳 在地球的每一個角落都是相同的,但是在相同的時間點會有不同的表達方式,所以有了另外一個時間概念,叫時區。這里的時區與地區不是同一個概念,例如我們所在的時區叫 東八區 。
在設備中,可以自己手動的切換當前的系統時區:
你會發現:當你選在不同的時區,你的當前時間是不一樣的。
第三句話:時間戳與時區在Code中應用
一、時間戳 是不會跟著 時區 的改變而改變
可以用代碼來證明這一點:
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
// 系統時區
NSTimeZone* timeZone = [NSTimeZone systemTimeZone];
NSLog(@"系統當前的時區: %@", timeZone.name);
// 返回的單位是 秒
NSTimeInterval timeInterval = [[NSDate date] timeIntervalSince1970] ;
NSLog(@"當前時間戳:%f", timeInterval);
}
你會發現,不管怎么切換時區,時間戳總是一致。可以實時的參照在線時間戳進行驗證。
二、不同 時區 間的時間切換
這個需求并不是空穴來風,在很多的app中都會用到的。比如根據服務器返回的時間與當前時間進行一個比較,這里就會有多種可能性,主要體現在服務器返回時間的方式,比如直接返回一個固定時間的字符串,比如:2017-06-14 22:55:23。然后接口的同事告訴你這個是 東八區 時間。讓你自己轉成當前 時區 的時間。
1、將當前 時區 的時間轉成不同 時區 的時間
不管當前設備的 時區 在什么地方,都將其轉成 東八區 的時間格式。代碼如下:
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
// 系統時區,默認就是當前的時區
NSTimeZone* timeZone = [NSTimeZone systemTimeZone];
NSLog(@"系統當前的時區: %@", timeZone.name);
// 獲取當前時間
NSDate* date = [NSDate date];
// 時間格式
NSDateFormatter * dateFormatter = [[NSDateFormatter alloc]init];
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
NSString* now = [dateFormatter stringFromDate:date];
NSLog(@"系統當前時間顯示: %@", now);
// 將時區設置成 東八區
[dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:8*3600]];
// 設置后的時間顯示
now = [dateFormatter stringFromDate:date];
NSLog(@"東八區的當前時間顯示: %@", now);
}
打印結果如下:
2、2017-06-08T11:29:29.209Z
當有一天你發現服務器返回這樣的時間,請不要束手無策,因為這個時間格式就已經明確的將時區也告訴你了,你只需要這樣做,就能隨時隨地的轉成當前時區的時間格式:
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
// 時間字符串 (帶有時區信息)
NSString* timeTEXT = @"2017-06-08T11:29:29.209Z";
// 對應時間格式
NSString* formateTEXT = @"yyyy-MM-dd'T'HH:mm:ss.SSSZ";
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:formateTEXT];
// 獲取當前對應時區的時間
NSDate* curDate = [dateFormatter dateFromString:timeTEXT];
NSLog(@"對應當前時區的時間: %@", curDate);
}
上面的代碼,沒有看到有 時區 間的切換,但是是正確的。因為timeTEXT已經自帶時區 信息。然而 NSDateFormatter 對象默認是當前設備的 時區。所以 curDate 就是當前設備的時間。