2012-10-09 29 views
3

如果我嘗試並使用來自任何地方的應用程序內任意設置時區執行以下操作:NSCalendar currentCalendar setTimeZone不設置

[[NSCalendar currentCalendar] setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"EST"]]; 
NSTimeZone *tz = [[NSCalendar currentCalendar] timeZone]; 
NSLog(@"%@", tz); 

日誌語句的結果是:

美洲/洛杉磯( PDT)偏移-25200(日光)

(這是我的本地時區,即[NSTimeZone systemTimeZone])

然而,NSCalendar類別中的功能類似的代碼工作正常:

[self setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"EST"]]; 
NSTimeZone *tz = [self timeZone]; 
NSLog(@"%@", tz); 

和日誌收益率:

美國/紐約(美國東部時間)的偏移量-14400(日光)

什麼正在設置[NSCalendar currentCalendar]的時區?這種行爲是違反直覺的。

回答

7

簡單的回答:+[NSCalendar currentCalendar]不返回相同的實例。它應該返回一個實例,該實例反映了+currentCalendar被稱爲時當前選定的區域設置和時區。有三種可能的合理行爲:

  • 它每次都會返回一個新值。
  • 它返回一個緩存值,除非它檢測到它應該應該返回一個新值。
  • 它返回一個緩存值,當它發現一個語言環境/日曆變化時清除它。

修改日曆只在第一種情況下是明智的。 (在第二種情況下,以+currentCalendar以前的通話將指向同一個實例。在第三種情況下,以+currentCalendar所有呼叫都將直到用戶改變區域設置/時區返回同一個實例。)

正確的方法來設置該應用的時區爲+[NSTimeZone setDefaultTimeZone:]

+0

好的,這是有道理的。它似乎正在失去價值,因爲我認爲行爲就像一個單身人士。相反,該方法每次都返回一個新的日曆實例。我可以嘗試引用一個獨特的[NSCalendar currentCalendar]實例並記錄時區,以驗證它是否有效,而不是調用新實例。如果我想以任何理由保留該日曆,我可以採用相同的方法。 – Michael

+1

答案取決於您最終希望通過「設置時區」來實現的目標。如果你想設置一個應用程序範圍的面向用戶的時區,使用'+ [NSTimeZone setDefaultTimeZone:]''就像我已經提到的那樣(它也可能滿足* basic *單元測試的需要)。但這可能會混淆用戶!但是,應用程序範圍的時區通常不合適。 iOS還支持日文和佛教年編號;如果您需要格式化/解析ISO 8601日期(例如iCalendar解析器),請使用'[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]'然後設置其時區。 –

相關問題