用于BST的NSDateFormatter而不是GMT + 1

时间:2014-02-07 16:40:45

标签: ios iphone nsdate nsdateformatter

我想在时间轴上显示以下字符串:

“GMT / BST”

以下是代码:

 NSDateFormatter *dateformatter=[[NSDateFormatter alloc] init];
[dateformatter setDateFormat:@"zzz"];
timeZoneString = [NSMutableString stringWithFormat:@"%@ / %@",[dateformatter stringFromDate:startDate],[dateformatter stringFromDate:endDate]];

但是这给出了“GMT / GMT + 01:00”

将“GMT + 01:00”转换为“BST”的NSDateFormatter代码是什么?尝试z | zzz | Z | ZZZ | v | V看看...... http://waracle.net/iphone-nsdateformatter-date-formatting-table/

我无法得到正确的格式化程序

2 个答案:

答案 0 :(得分:0)

原来在iOS中有48个时区缩写(例如'BST')的内置数组。

NSDictionary *tzDict = [NSTimeZone abbreviationDictionary]; 

此阵列中有419个时区名称(例如“欧洲/伦敦”):

NSArray *timeZoneNames = [NSTimeZone knownTimeZoneNames];

tzDict包含时区名称子集的夏令时缩写。因此,算法将检查我们是否在DST中,然后查看tzDict是否有一个条目,并替换该条目,如果不是,请使用

[NSTimeZone abbreviation];

以下是关于时区的一些其他主题。

Daylight saving time and time zone best practices

How can I map tz database names to city and country names?

C# british summer time (BST) timezone abbreviation

http://en.wikipedia.org/wiki/List_of_tz_database_time_zones

GMT timezone conversion in objective c

答案 1 :(得分:0)

我花了一天的时间,并希望确保其他人不会挂在上面。

对于英国区域/地区,DateFormatter中的“ z”字段模式将返回“美国/伦敦”时区的正确字符串(例如“ GMT”或“ BST”)。但是,如果您使用美国地区/地区,则“ z”会给您“ GMT + 1”。

当不存在具有给定语言环境 的给定目标时区的缩写时,就会发生陷阱。我使用的是“ v”字段模式,在美国地区,“欧洲/伦敦”回落到“英国时间”,这炸毁了我的文字标签。 “ z”更好,在DST中会回落到“ GMT + 1”,但仍不是所需的“ BST”。

缩写Dictionary不考虑夏令时。这是为了将缩写映射到时区。您会发现“ BST”:“ Americal / London”,但这仅适用于遵守@Nick T提到的夏令时。在标准时间,英国人习惯于看到“ GMT”。

不幸的是,如果您自己没有重新创建时区功能,那么您将不得不妥协。我认为iOS在这里可以做得更好。

参考