有没有办法使用(仅)国家代码(有效的 ISO-3166 代码)获得时区?

Posted

技术标签:

【中文标题】有没有办法使用(仅)国家代码(有效的 ISO-3166 代码)获得时区?【英文标题】:Is there a way to get a timeZone with (only) a country code (valid ISO-3166 code)? 【发布时间】:2010-11-26 06:22:57 【问题描述】:

我正在尝试为用户获取 TimeZone。

为此,我有一个国家代码,它是一个有效的 ISO 国家代码。这些代码是 ISO-3166 定义的大写的两个字母代码。您可以在许多网站上找到这些代码的完整列表,例如: http://www.chemie.fu-berlin.de/diverse/doc/ISO_3166.html

我认为答案是“不,因为它是多对多关系......像美国这样的国家可能有很多时区......”。这就是问题所在……

我尝试过类似的东西:

//CountryEnum contains ISO_3166 values (http://www.chemie.fu-berlin.de/diverse/doc/ISO_3166.html) 
  //List all country to test timezone:
  for (int i = 0; i < CountryEnum.values().length; i++) 
   String isoCountryCode = CountryEnum.values()[i].name();// Get the iso country code
   Locale locale = new Locale(isoCountryCode);// Build a country specific locale
   Calendar calendar = Calendar.getInstance(locale);// Build a calendar with the specific locale
   String timeZone = calendar.getTimeZone().getDisplayName();// Build a timeZone with the calendar
   System.out.println("LOCALE : "+locale+" / COUNTRY: "+isoCountryCode+" / TIMEZONE: "+timeZone);
  

但它总是返回服务器 TimeZone ...

有什么想法吗?

【问题讨论】:

【参考方案1】:

Locale 不是TimeZone,反之亦然。检查Javadoc 以了解您正在使用的方法 - 第一行说

获取使用默认时区和指定区域设置的日历。

这就是您获得默认时区的原因 - 因为您在获取日历时没有指定时区。

想想 Jon 所说的 - 如果您知道在确定用户来自美国的情况下要使用哪个时区,那么您可以调用采用时区的 Calendar.getInstance 方法 一个语言环境。另一方面,如果你不能明确地说你会在这里做什么,那么回到绘图板上,多考虑一下你的需求,而不是看你的实现。

如果你不能回答上一个问题,我认为大多数网站的标准追索权是允许用户指定他们的首选时区(如果他们在服务器上有一个永久帐户),如果他们默认他们为服务器的时区没有说别的。如果他们没有永久帐户,并且他们向您提供时间信息(例如 XML 上传),那么他们将必须指定他们在请求中使用的时区,或者(可能更好)您要求始终使用 UTC。

【讨论】:

不仅如此,单个 arg Locale 构造函数指定语言,而不是国家/地区。【参考方案2】:

您可以为此使用 ICU4J... 见 http://helpdesk.objects.com.au/java/can-i-find-all-available-timezones-for-a-country

【讨论】:

这很方便,但返回的列表似乎是按名称的字母顺序排列的;遗憾的是,ICU4J 没有提供一种方法来获取“国家代码最不令人惊讶的时区”以用于显示目的;这很可能是首都。【参考方案3】:

你完全正确。 美国 - 或俄罗斯,或其他各种“大”国家(就东方/西方而言)没有一个时区。

美国当然是一个简单的例子 - 您想使用哪个时区? America/Los_Angeles? America/New_York?还有什么?

【讨论】:

有趣的是,一个时区还有其他大国;印度和中国都属于这一类。印度通常会覆盖两个时区;中国将覆盖 4 个时区。 是的 - 一些国家在时区方面选择了理智 :) 理智——是的;一种。但在中国,如果太阳在东海岸早上 5 点升起,在戈壁沙漠的西部边缘直到早上 8 点左右才升起。如果它在东海岸设置在晚上 7 点,那么它在西部直到晚上 10 点才会设置。 @Jonathan:这对我来说似乎很合理......而且在组织会议(等)时不必考虑时区的好处是大量。我对时区怀恨在心:)【参考方案4】:

我不知道有什么可以为您提供此功能(正如 Jon 指出的用例相当有限),但您可以使用 this data 构建地图。该列表将是一个多地图,因此您可能会使用 Google Collections 中的该列表,或者使用您自己的 ISO-code->List&lt;String&gt; 地图。

给定时区字符串,您可以创建一个 TimeZone 对象并从那里开始。但是,如果该国家/地区有多个时区,则您必须决定如何处理。

【讨论】:

没错,这对我来说是最好的解决方案。我想我可能会将时区与一个国家/地区进行映射,以便按国家/地区拥有一个独特的时区。【参考方案5】:

这里是您正在寻找的解决方案:

public String getTimeZoneByLocale(final String languageTag)
    final Locale locale = Locale.forLanguageTag(languageTag);
    final Calendar cal = Calendar.getInstance(locale);
    final TimeZone timeZone = cal.getTimeZone();
    return timeZone.getID();

languageTag 是 en_US 或 ru_RU 之类的代码

【讨论】:

不,这将返回TimeZone.getDefault()【参考方案6】:

olson 数据库包含所有映射。 Link

搜索 zone.tab 文件。

【讨论】:

【参考方案7】:

您尝试过TZInfo gem 吗?

您可以通过这种方式获取一个国家/地区的时区:

>> TZInfo::Country.get("DE").zone_identifiers
=> ["Europe/Berlin", "Europe/Busingen"]
>> TZInfo::Country.get("CN").zone_identifiers
=> ["Asia/Shanghai", "Asia/Harbin", "Asia/Chongqing", "Asia/Urumqi", "Asia/Kashgar"]
>> TZInfo::Country.get("US").zone_identifiers
=> ["America/New_York", "America/Detroit", "America/Kentucky/Louisville",   "America/Kentucky/Monticello", "America/Indiana/Indianapolis", "America/Indiana/Vincennes", "America/Indiana/Winamac", "America/Indiana/Marengo", "America/Indiana/Petersburg", "America/Indiana/Vevay", "America/Chicago", "America/Indiana/Tell_City", "America/Indiana/Knox", "America/Menominee", "America/North_Dakota/Center", "America/North_Dakota/New_Salem", "America/North_Dakota/Beulah", "America/Denver", "America/Boise", "America/Phoenix", "America/Los_Angeles", "America/Anchorage", "America/Juneau", "America/Sitka", "America/Yakutat", "America/Nome", "America/Adak", "America/Metlakatla", "Pacific/Honolulu"]

【讨论】:

这是一个 Java 问题

以上是关于有没有办法使用(仅)国家代码(有效的 ISO-3166 代码)获得时区?的主要内容,如果未能解决你的问题,请参考以下文章

iOS如何查找用户电话号码的国家代码?

有没有办法将国家/地区的两个字母字母代码显示在地图上?

如何仅在 github 上找到 python 3 代码?

有没有办法在没有 WPF 或 Visual Studio 的情况下在 C# 中制作 GUI(仅使用代码)?

有没有办法让这个代码更有效,更小?

使用 pygal.maps.world 时,有没有办法格式化显示一个国家人口的数字?