2011-08-30 36 views
4

當我打電話給NSTimeZone’s的縮寫方法它返回GMT-07:00。然後,當我使用此值查找時區名稱或(time zone identifier)時,它將返回nil如何將時區偏移縮寫轉換爲官方時區標識符?

我需要檢索官方time zone identifier,例如America/Los_Angeles。因此,如何將時區偏移縮寫(例如,GMT-07:00)轉換爲官方時區標識?

這裏是我的代碼:

NSTimeZone* localTimeZone = [NSTimeZone localTimeZone]; 
NSString* localAbbreviation = [localTimeZone abbreviation]; 
NSDictionary* abbreviationDictionary = [NSTimeZone abbreviationDictionary]; 
NSString* timeZoneID = 
[abbreviationDictionary objectForKey:localAbbreviation]; //should return 'America/Los_Angeles' if the abbreviation is ‘PDT’ 
+2

這是不可能在我看來。有超過24個時區。時區偏移到實際時區的確切映射是不可能的。 –

+0

順便說一句,在我的語言環境/位置調用'[[NSTimeZone localTimeZone]縮寫]''返回'@「CEST」'而不是數字偏移量。 –

+1

感謝Ole,我得到GMT-07:00,這是一個無效的本地時區縮寫。 – johnnieb

回答

5

(我改寫了我的答覆,我之前誤解了這個問題)。

下面是關於如何在的時區的縮寫轉換的例子:

NSTimeZone* localTimeZone = [NSTimeZone localTimeZone]; 
NSString* localAbbreviation = [localTimeZone abbreviation]; 

要從localAbbreviation轉換回來,是早晚的事情來重新創建區:

NSTimeZone* timeZoneFromAbbreviation = [NStimeZone timeZoneWithAbbreviation:abbreviation]; 
NSString* timeZoneIdentifier = timeZoneAbbreviation.name; 

NSLog(@"Identifier: %@", timeZoneIdentifier); // Outputs America/Santiago for me. 

您確定縮寫正在返回「GMT-07:00」嗎?礦井返回「CLT」,而不是GMT偏移量。

+1

不幸的是,當本地時區的值以GMT偏移量表示時,這不起作用。當調用NSTimeZone的描述方法時,我得到以下內容:本地時區(等/ GMT + 7(GMT-07:00)偏移-25200) – johnnieb

+0

奇怪的是,它應該返回「PST」,實際上,查看字典('NSLog(@「timeZone:%@」,[NSTimeZone abbreviationDictionary]);'),'America/Los_Angeles'已註冊,但localTimeZone返回錯誤的縮寫...我會嘗試更改我的日期蘋果手機。 – Can

+0

好的,我將iPhone的時區更改爲「America/Los Angeles」,縮寫代碼正常工作('Identifier:America/Los_Angeles')。對不起,我無法複製該問題。如果有幫助,我的'timeZoneDataVersion'返回「2010o」。 – Can

2

希望這可能是有益的 編輯的+應該在那裏,以準確顯示爲正常縮寫

-(NSString*)getTimeZoneStringForAbbriviation:(NSString*)abbr{ 
     NSTimeZone *atimezone=[NSTimeZone timeZoneWithAbbreviation:abbr]; 
     int minutes = (atimezone.secondsFromGMT/60) % 60; 
     int hours = atimezone.secondsFromGMT/3600; 
     NSString *aStrOffset=[NSString stringWithFormat:@"%02d:%02d",hours, minutes]; 
     return [NSString stringWithFormat:@"GMT+%@",aStrOffset]; 
    } 
+0

良好的calcualations優良的答案,請加上+ stringWithFormat – ashokdy

+0

將把「+」在您的格式字符串適用於格林尼治標準時間爲負的區域?如GMT-7:00。將+加在第一個格式字符串中可能會更好:stringWithFormat:@「%+ 02d:%02d」如果數字是正數,那麼會導致stringWithFormat添加+。 (上面的例子可能爲分鐘數加上一個' - '以及負的GMT偏移量。) –

+0

謝謝Ashok,但實際上+並非適用於所有時區。所以它不能在那裏硬編碼,你說什麼?我想我需要在代碼中加入一些東西。所以我也同意@WaltSellers。 – Mrug

相關問題