如何以字符串形式返回系统时区?

How do you return the system time zone as a string?

提问人:tombuarts 提问时间:12/9/2011 更新时间:12/9/2011 访问量:4339

问:

我有一个应用程序,可以在其中为全球各个城市设置时区。我这样做没有问题,而且效果很好。当应用程序首次加载时,它会找到您的当前位置(纬度和经度),并使用设备默认时区设置时区。我需要在字符串中返回默认时区,以便我可以显示它。我不想要“GMT”或“EDT”,我想要“美国/New_York”或“欧洲/伦敦”的格式。有什么想法吗?

目标-C

评论


答:

0赞 one.beat.consumer 12/9/2011 #1

我不认为有一个对象可以自动将时区与物理地点相关联。

我看到你已经标记了这个objective-c,但在C#中,你可以做一些简单的事情,比如:

public Enum TimeZone
{
    [Description("New York")]
    EDT,
    [Description("Los Angeles")]
    PST
}

public static string GetDescription(Enum value)
{
    FieldInfo fi= value.GetType().GetField(value.ToString()); 
    DescriptionAttribute[] attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false);
    return (attributes.Length>0)?attributes[0].Description:value.ToString();
}

我不确定这在多大程度上容易移植到 Objective-C,并且它确实需要使用 C# 中的反射库。

0赞 Jonathan Grynspan 12/9/2011 #2

好吧,您假设与 是同一时区。事实并非如此。:)是的,它们是相同的 UTC 偏移量,但就您的系统而言,它们是独立定义的。可可知道它们之间没有很强的联系。EDTAmerica/New_York

同样,如果用户给你,你会返回吗? ? ?没有 1:1 的对应关系。哦,还有:甚至不是单个 UTC 偏移量所独有的。澳大利亚东部夏令时也缩写,我是可可文档告诉我的。EDTNew_YorkTorontoPanamaEDTEDT

缩写和长名称之间有一张地图,但同样,当有多个协会(例如纽约和巴拿马)时,它们是任意选择的。[NSTimeZone abbreviationDictionary]

从更广泛的意义上说,你想实现什么?你的目标是什么?告诉我们,我们也许可以提出另一种实现它的方法。:)

评论

0赞 Firoze Lafeer 12/9/2011
对此有一个公认的约定。您可以查看 +[NSTimeZone knownTimeZoneNames] 了解 iOS 使用的那些。
0赞 Jonathan Grynspan 12/9/2011
是的,但它们与缩写没有 1:1 的对应关系。
14赞 Firoze Lafeer 12/9/2011 #3

听起来你想要这个:

NSString *timeZoneName = [[NSTimeZone localTimeZone] name];

这对我来说返回“美国/New_York”,这里是 EST 时区。

或者给定任何你可以得到它的,这是你正在寻找的常规名称(例如“亚洲/东京”或“欧洲/伦敦”。NSTimeZone *tz[tz name]

查看可能的名称列表。+[NSTimeZone knownTimeZoneName]

我希望这会有所帮助。