iOS獲取時區詳解


★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公眾號:山青詠芝(shanqingyongzhi)
➤博客園地址:山青詠芝(https://www.cnblogs.com/strengthen/ 
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:https://www.cnblogs.com/strengthen/p/16160003.html
➤如果鏈接不是山青詠芝的博客園地址,則可能是爬取作者的文章。
➤原文已修改更新!強烈建議點擊原文地址閱讀!支持作者!支持原創!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

熱烈歡迎,請直接點擊!!!

進入博主App Store主頁,下載使用各個作品!!!

注:博主將堅持每月上線一個新app!!!

systemTimeZone
系統當前使用的時區。如果無法確定當前時區,則返回 GMT 時區。

這是設備認為它所在的時區;它通常是自動設置的,然后會對應於設備的物理位置,但如果用戶在設置應用程序中明確設置了特定的時區,這就是你會得到的。

defaultTimeZone
當前應用程序的默認時區。如果沒有設置默認時區,該方法調用systemTimeZone並返回系統時區。

您的應用程序可以設置自己的時區,以便您可以像設備在另一個時區一樣執行操作,但不會影響系統時區(以及其他應用程序)。通過調用 來執行設置setDefaultTimeZone:如果您還沒有這樣做,則此調用與調用相同systemTimeZone

localTimeZone
將所有消息轉發到當前應用程序的默認時區的對象。本地時區始終代表默認時區的當前狀態。

這是它變得有點棘手的地方。localTimeZone給你幾乎相同的結果defaultTimeZoneNSTimeZone不同之處在於,您從中獲取的特定實例localTimeZone將始終反映您對應用程序中的時區所做的設置。您可以調用它一次,保存結果,並始終通過該對象獲取當前模擬時區,無論所做的更改如何。就好像,當您使用此NSTimeZone實例時,框架正在召喚defaultTimeZone您,以確保您始終獲得當前值。

這是上面的幾個簡要說明。您返回的NSTimeZone對象systemTimeZone代表您撥打電話時的系統時區。如果您systemTimeZone再次調用,即使用戶已經更改了時區,您也會得到相同的時區。您的應用程序會緩存該值,您必須要求系統清除它resetSystemTimeZone才能獲取更新。

// Say that device is in GMT originally
NSLog(@"%@", [NSTimeZone systemTimeZone]);    // GMT
// User flies into Rome and iPhone changes the zone automatically
NSLog(@"%@", [NSTimeZone systemTimeZone]);    // Still GMT
[NSTimeZone resetSystemTimeZone];    // Clear app's cache
NSLog(@"%@", [NSTimeZone systemTimeZone]);    // Now GMT+2 

類似的事情發生在defaultTimeZone當您調用該方法時,您將獲得一個始終表示同一時區的對象,即使您稍后調用setDefaultTimeZone:但是,如果您使用從中獲取的對象localTimeZone,它將遵循您對默認時區所做的更改*。

// Say that defaultTimeZone is originally GMT
NSTimeZone * myDefaultTZ = [NSTimeZone defaultTimeZone];
NSTimeZone * myLocalTZ = [NSTimeZone localTimeZone];
[NSTimeZone setDefaultTimeZone:[NSTimeZone timeZoneWithName:@"Etc/GMT-4"]];
NSLog(@"%@", myDefaultTZ);    // Still gives GMT
NSLog(@"%@", [NSTimeZone defaultTimeZone]);    // GMT-4, the new value
NSLog(@"%@", myLocalTZ);    // Also the new value!

蘋果似乎建議使用 localTimeZone

使用 localTimeZone 類方法,您可以獲得一個相對時區對象,該對象將自身解碼為它所在的任何計算機上的默認時區。

*注意,localTimeZone仍以系統時區的應用級緩存為准。它只會根據您對默認時區的設置進行更改。

獲取時區的方法解析

方法一(存在問題)

[NSTimeZone resetSystemTimeZone];
NSTimeZone *timeZone = [NSTimeZone systemTimeZone];
NSLog(@"timeZoneString = %@",timeZone.abbreviation);

在本地測試沒有問題,比如手機時間是東八區的時間,那么就打印出GMT+8,設置成其他地區的時間也正常。但當時區設置為0時,打印出來的是GMT,而不是GMT+0,從這個角度看,這種方法似乎也不妥,還需要自己轉換。

此外,經過大量的測試,這種方法在個別手機上獲取到的時間格式不是GMT的格式。比如香港的個別手機獲取到的時區是HKT,表示的是香港時間。同樣每個地區都有當地時區的簡稱(參考:世界時區)。 

其實看看文檔就會發現這種方法不適合目前的需求。

The abbreviation for the receiver, such as “EDT” (Eastern Daylight Time).

方法二

NSDate *date = [NSDate date];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.dateFormat = @"z";
NSLog(@"timeZoneString = %@",[dateFormatter stringFromDate:date]);

這里小寫的z表示的是時區的意思。同樣也可是試試看看大寫的Z這種方法沒有做大量的測試。當時區設置為0時,同樣打印出來的是 GMT這種方法也有可能會出現方法一的問題。

方法三

[NSTimeZone resetSystemTimeZone];
NSInteger offset = [NSTimeZone systemTimeZone].secondsFromGMT;
offset = offset / 3600;
NSString *timeZoneString = nil;
if (offset < 0) {
    timeZoneString = [NSString stringWithFormat:@"GMT%ld", offset];
} else {
    timeZoneString = [NSString stringWithFormat:@"GMT+%ld", offset];
}
NSLog(@"timeZoneString = %@",timeZoneString);

相關方法解析通過時間偏差來計算時區。

- (NSInteger)secondsFromGMT;
獲取到當前時區和0時區的間隔秒數。

+ (NSTimeZone *)systemTimeZone;
+ (NSTimeZone *)localTimeZone;
+ (NSTimeZone *)defaultTimeZone;

區別
1、systemTimeZone 獲取系統的時區,不可設置。當前應用程序的默認時區。如果沒有設置默認時區,該方法調用systemTimeZone並返回系統時區。

2、defaultTimeZone 獲取當前APP的時區,可以自己設置。當前應用程序的默認時區。如果沒有設置默認時區,該方法調用systemTimeZone並返回系統時區。

3、localTimeZone 將所有消息轉發到當前應用程序的默認時區的對象。本地時區始終代表默認時區的當前狀態。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM