从人类可读的时区字符串中获取时区ID

时间:2013-09-17 16:28:04

标签: java android time timezone

有没有办法将人类可读的时区字符串Eastern Standard Time转换为时区ID而不进行硬编码?

如果我获得时区ID,那么我可以相应地设置时区。

2 个答案:

答案 0 :(得分:2)

您可以使用TimeZone类来枚举时区ID和字符串。您还可以从字符串值设置TimeZone。

TimeZone类和Locale类可用于在当前或某个指定时区中查找适当的时区名称。例如,这段代码片段

final Locale fr_FR = Locale.FRANCE;
final Locale de_DE = Locale.GERMANY;
for (String s : TimeZone.getAvailableIDs()) {
    final TimeZone tz = TimeZone.getTimeZone(s);
    sb.append(tz.getDisplayName() + "<br>");
    sb.append(tz.getDisplayName(fr_FR) + "<br>");
    sb.append(tz.getDisplayName(de_DE) + "<br>");
    sb.append("<br>");
}

列出了一些欧洲时区的以下名称:

Eastern European Standard Time
heure normale de l’Europe de l’Est
Osteuropäische Normalzeit

Western European Standard Time
heure normale d’Europe de l’Ouest
Westeuropäische Normalzeit

Central European Standard Time
heure normale de l’Europe centrale
Mitteleuropäische Normalzeit

答案 1 :(得分:0)

您应该首先使用ID,例如America/New_York

问题是“东部标准时间”和“东部夏令时”都映射到相同的ID。

此外,这些是显示名称的英文形式。法国的用户可能会使用Europe/Paris区域,而在英语中,我们会使用“中欧标准时间”或“中欧夏令时”的显示名称。但在法语中,他们会使用“heure normale de l'Europe centrale”或“heureavancéed'Europecentrale”的显示名称。 Unicode CLDR有这些翻译。我不确定Android使用它们的程度。

另外,当你说“中央标准时间”之类的东西时 - 这不一定是唯一的。您可能在谈论America/Chicago,或者您可能在谈论America/Costa_Rica。哎呀,你可能在谈论Australia/Adelaide,虽然有些人可能称之为“澳大利亚中央标准时间”,但这与称我们的“美国中央标准时间”大致相同。

所以......显示显示名称,但存储ID。保留ID并使用它 - 不要试图从显示名称猜测它。