2011-05-12 19 views
48

我看到NSTimeZone有以下方法:iPhone - 時區便利的方法之間的差異

defaultTimeZone 
localTimeZone 
systemTimeZone 

能有人向我解釋,簡單來說,有什麼不同之處beetween這些調用,當一個應該使用而不是其他?我不明白蘋果文檔裏面有關於此的任何內容。

回答

70

當然,文檔中的語言有點乾燥,名稱的相似性可能會令人困惑。我在這裏引用NSTimeZone docs,並試圖解釋他們:

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

這是設備認爲它在的時區;它通常會自動設置,然後會與設備的物理位置相對應,但如果用戶已經在設置應用程序中明確設置了特定時區,那就是您會得到的。

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

您的應用程序可以設置自己的時區,以便您可以執行操作,就好像該設備位於另一個區域中一樣,但不會影響系統時區(以及其他應用程序)。該設置通過致電setDefaultTimeZone:進行。如果你還沒有這樣做,這個調用與調用systemTimeZone相同。

localTimeZone
的所有郵件轉發到當前應用程序的默認時區的對象。本地時區始終表示默認時區的當前狀態。

這就是它有點棘手。 localTimeZone給你幾乎與defaultTimeZone相同的結果。區別在於,您從localTimeZone獲得的具體NSTimeZone實例將始終反映您對應用中的時區所做的設置。您可以調用一次,保存結果,並始終通過該對象獲取當前模擬時區,而不管所做的更改。就好像,當你使用這個NSTimeZone實例時,框架爲你調用defaultTimeZone,以確保你總是得到當前值。

下面是上述幾個簡要說明。從systemTimeZone獲取的NSTimeZone對象表示您撥打電話時的系統時區。如果您再次撥打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! 

蘋果似乎recommend usinglocalTimeZone

與localTimeZone類的方法,你可以得到解碼本身成爲上找到自己的任何計算機上的默認時區相對時間區對象。


*需要注意的是localTimeZone仍受到系統時區的應用程序級緩存。它只會更改爲遵循默認時區的設置。

+0

我不明白在defaultTimeZone和localTimeZone之間的區別。我知道systemTimeZone是系統首選項中定義的一個,如果有一個或設備位置。 defaultTimeZone是模擬的應用程序,或者系統之一,如果沒有在應用程序中模擬。那麼...... localTimeZone有什麼用?你對localTimeZone的說法似乎與你對defaultTimeZone所說的相同。你能否在這一點上完成你的回答? – Oliver 2011-05-13 12:01:58

+0

@Oliver:你說得對,'localTimeZone'給你幾乎和'defaultTimeZone'一樣的結果。我試圖說明我的答案最後的唯一區別:從localTimeZone獲得的特定'NSTimeZone'對象將始終反映您對應用中的時區所做的設置。您可以調用一次,保存對象,並始終通過該對象獲取當前模擬時區,而不管所做的更改。就好像,當你使用這個對象時,框架每次都爲你調用'defaultTimeZone',以確保總是獲得當前值。這有幫助嗎? – 2011-05-13 17:03:33

+0

很明顯。我明白,使用任何包含調用'localTimeZone'結果的變量都會反映變化。但是這不會發生包含'defaultTimeZone'結果的變量。是對的嗎 ? – Oliver 2011-05-14 17:28:00