我正在尝试为用户获取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 ......
有什么想法吗?
答案 0 :(得分:6)
Locale
不是TimeZone
,反之亦然。检查Javadoc以了解您正在使用的方法 - 第一行是
使用默认时区和指定的区域设置获取日历。
这就是你获得默认时区的原因 - 因为你在获取日历时没有指定一个。
想想Jon说的话 - 如果你知道在你计算出用户来自美国的情况下你想要使用什么时区,那么你可以调用需要时区的Calendar.getInstance
方法和一个区域设置。另一方面,如果你不能肯定地说你会在这里做什么,那么回到绘图板再考虑一下你的要求,而不是看你的实现。
如果您无法回答上一个问题,我认为大多数网站的标准资源是允许用户指定他们的首选时区(如果他们在服务器上有持久帐户)并将其默认为服务器的时区没有另外说。如果他们没有持久帐户,并且他们有时会向您提供信息(例如XML上传),那么他们必须指定他们在请求中使用的时区,或者(可能更好)您要求始终使用UTC。
答案 1 :(得分:4)
您可以使用ICU4J ...请参阅http://helpdesk.objects.com.au/java/can-i-find-all-available-timezones-for-a-country
答案 2 :(得分:3)
你说得对。那里的 没有一个时区 - 或俄罗斯,或其他各种“大”国家(就东/西而言)。
美国当然是一个简单的例子 - 你想用什么时区? America/Los_Angeles
? America/New_York
?还有别的吗?
答案 3 :(得分:0)
我不知道有什么东西给你这个(正如Jon指出的用例相当有限)但你可以用this data建立一个Map。该列表将是一个多地图,因此您可能会使用Google集合中的列表,或使用您自己的ISO代码 - &gt;列表<String>
地图。
给定时区字符串,您可以创建一个TimeZone对象并从那里开始。但是,如果该国家/地区有多个时区,则必须决定如何处理该时区。
答案 4 :(得分:-2)
olson数据库包含所有映射。 Link
搜索zone.tab文件。
答案 5 :(得分:-2)
你试过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"]
答案 6 :(得分:-2)
这是您正在寻找的解决方案:
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
的代码