★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公眾號:山青詠芝(shanqingyongzhi)
➤博客園地址:山青詠芝(https://www.cnblogs.com/strengthen/ )
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:https://www.cnblogs.com/strengthen/p/16160003.html
➤如果鏈接不是山青詠芝的博客園地址,則可能是爬取作者的文章。
➤原文已修改更新!強烈建議點擊原文地址閱讀!支持作者!支持原創!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
systemTimeZone
系統當前使用的時區。如果無法確定當前時區,則返回 GMT 時區。
這是設備認為它所在的時區;它通常是自動設置的,然后會對應於設備的物理位置,但如果用戶在設置應用程序中明確設置了特定的時區,這就是你會得到的。
defaultTimeZone
當前應用程序的默認時區。如果沒有設置默認時區,該方法調用systemTimeZone
並返回系統時區。
您的應用程序可以設置自己的時區,以便您可以像設備在另一個時區一樣執行操作,但不會影響系統時區(以及其他應用程序)。通過調用 來執行設置setDefaultTimeZone:
。如果您還沒有這樣做,則此調用與調用相同systemTimeZone
。
localTimeZone
將所有消息轉發到當前應用程序的默認時區的對象。本地時區始終代表默認時區的當前狀態。
這是它變得有點棘手的地方。localTimeZone
給你幾乎相同的結果defaultTimeZone
。NSTimeZone
不同之處在於,您從中獲取的特定實例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 將所有消息轉發到當前應用程序的默認時區的對象。本地時區始終代表默認時區的當前狀態。