如何在android中获取移动时区的缩写/国家代码?
Posted
技术标签:
【中文标题】如何在android中获取移动时区的缩写/国家代码?【英文标题】:How to get the abbreviation / Country code of mobile timezone in android? 【发布时间】:2015-06-04 09:47:00 【问题描述】:如何获取 IST(印度标准时间)、ET(东部时间)等时区缩写。
我已经使用下面的代码来获取android中的时区信息,
选项 1:
String mobileTimeZone = Calendar.getInstance().getTimeZone()
.getDisplayName(false, TimeZone.SHORT);
我选择了不同的时区,输出如下,
格林威治标准时间+13:00
格林威治标准时间+00:00
但是当设置一些时区时,它会给我正确的缩写代码作为下面的输出,
美国东部标准时间
我还尝试了下面的代码,它给出了时区的完整描述。
选项 2:
String mobileTimeZone = Calendar.getInstance().getTimeZone().getID();
得到以下输出,不过是区域名称:
太平洋/中途岛
太平洋/檀香山
美国/蒙得维的亚
是否有任何包含所有时区的 id 或表列表供我映射。
并且还需要考虑日光节约。
帮我从android mobile获取时区的缩写。
【问题讨论】:
Have you visited this 是的。那也没有帮助。旧帖子说该方法已弃用。没有得到正确的解决方案。 您的问题与How to get TimeZone from android mobile?重复 不重复。已经提到了那个问题。我的问题是获取国家代码。不是区域名称或时区对象。 试试这个问答How to get Country (or its ISO code)? 【参考方案1】:关于术语:
我们将字符串称为“America/Denver”等(格式为区域/城市)时区标识符,而不是名称。这些 id 在 IANA-TZDB 中定义。 时区名称和缩写是一个完全不同的概念。这些数据通常起源于 CLDR 文件(来自 Unicode 联盟,例如 here),并且与大多数人在他们的语言环境中所期望的一致。这些名称是高度本地化的。一般来说,对于标识符和名称都没有国际标准。后者只是遵循当地习俗。
映射:
可以在IANA-TZDB 中找到从时区标识符到国家代码(反之亦然)的映射。然后,您可以快速看到没有您期望的唯一映射。例子:
欧洲/苏黎世在瑞士、德国(原文如此!)和 列支敦士登。
或琐碎:
美国有多个时区(America/New_York、America/Chicago、 等等)
您希望使用表达式获得独特的时区缩写
Calendar.getInstance().getTimeZone().getDisplayName(false, TimeZone.SHORT);
不现实。 您描述的获取 tz 缩写的方法是正确的。 但是,正如您自己在其他 SO-post 中注意到的那样,结果因一台 Android 设备而异。主要原因是不同的设备(dalvik vms)通常有不同的时区名称数据(还有 OpenJDK-Oracle-VMs)。
从时区名称和缩写到国家代码的唯一映射通常是不可能的。反例:“IST”可以代表“印度标准时间”或以色列时区。或者:“BST”用于“欧洲/伦敦”(夏季)或“太平洋/布干维尔”(全年)。
关于夏令时:
标识符对夏令时不敏感。相关数据可以是夏令时或不夏令时,取决于相关时间。时区名称和缩写通常(并非总是)敏感,例如比较美国的“PST”或“PDT”。
总结和建议:
请勿将时区名称或缩写用于显示目的以外的任何用途。您不应将这些本地化数据用于任何结论或存储目的。
【讨论】:
@ Meno...感谢您提供完整的描述性答案...非常清晰整洁。我想通过自己进行映射来在 UI 中显示用户时区。正如您所建议的,我们不必自己进行映射,因为 IST 本身具有不同的含义。所以我们删除了向用户显示时区的功能。再次感谢您的支持。 好吧,我不会说本地化的 tz 名称不好。许多用户喜欢看到它(以他们的语言和区域设置)。但我也提倡提供相对于 UTC 的具体数字 tz 偏移量,以帮助用户解释所提供的时区和相关的时间戳。也许标识符作为用户的附加信息,但这些标识符是相当技术性的,仍然与唯一的明确偏移信息无关。以上是关于如何在android中获取移动时区的缩写/国家代码?的主要内容,如果未能解决你的问题,请参考以下文章