2011-08-30 30 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

相关问题