有没有办法让与(只)国家代码(有效的ISO-3166代码)时区?(Is there a way to

2019-07-05 11:24发布

我试图得到一个用户的时区。

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

我认为回答是“没有,因为它是一个多对多的关系...可以有多个时区像美国的国家......”。 那就是问题所在...

我tryied是这样的:

//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);
  }

但是,它总是返回服务器时区...

有任何想法吗 ?

Answer 1:

一个Locale不是一个TimeZone ,反之亦然。 检查的Javadoc为您所使用的方法-的第一行说:

使用默认时区和指定语言环境的日历。

这就是为什么你得到默认的时区 - 因为你获得一个日历时没有指定一个。

想想乔恩说-如果你知道什么时区,你想在你已经摸索出了用户从美国的情况下使用,那么你可以调用Calendar.getInstance方法,需要一个时区语言环境。 在另一方面,如果你不能肯定地说,你会做什么在这里,然后回到绘图板,想想你的要求多一点,而不是看你的实现。

如果你不能回答前一个问题,我想大多数网站的标准办法是允许用户指定他们的首选时区(如果他们在服务器上有一个持久的帐户),并默认为服务器的时区,如果他们没有否则说。 如果他们没有固定的账户,他们正在与(例如XML上传)次给你提供信息,那么他们将不得不要么说明他们正在使用中的要求是什么时区,或(可能更好)你强制所有时间使用UTC的。



Answer 2:

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



Answer 3:

你说得对。 有没有为美国一个时区-或俄罗斯或其他各种“大”国家(东/西方面)。

美国当然是一个简单的例子 - 你会想用什么时区? America/Los_AngelesAmerica/New_York ? 别的东西?



Answer 4:

我不知道的东西,让你这个(如乔恩指出,用例是相当有限的),但你可以建立使用地图这个数据 。 该列表将是一个多图,所以也许你会使用来自谷歌集合,或使用自己的ISO-代码- >列表<String>地图。

由于时区的字符串,你可以创建一个TimeZone对象,并从那里走。 但是,如果全国有多个时区,你必须决定如何处理。



Answer 5:

奥尔森数据库中包含所有映射。 链接

搜索zone.tab文件。



Answer 6:

你有没有试过TZInfo宝石?

你可以得到一个国家这样的时区:

>> 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"]


Answer 7:

在这里,你正在寻找的解决方案:

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代码



文章来源: Is there a way to get a timeZone with (only) a country code (valid ISO-3166 code)?