我需要时区显示值如下:
(UTC + 05:30) Chennai, Kolkata, Mumbai, New Delhi
但是通过使用以下方法,我得到了一些不同的输出。我应该如何获得上述时区显示名称?(如果需要,我可以使用 JODA)。
public class TimeZoneUtil {
private static final String TIMEZONE_ID_PREFIXES =
"^(Africa|America|Asia|Atlantic|Australia|Europe|Indian|Pacific)/.*";
private static List<TimeZone> timeZones;
public static List<TimeZone> getTimeZones() {
if (timeZones == null) {
timeZones = new ArrayList<TimeZone>();
final String[] timeZoneIds = TimeZone.getAvailableIDs();
for (final String id : timeZoneIds) {
if (id.matches(TIMEZONE_ID_PREFIXES)) {
timeZones.add(TimeZone.getTimeZone(id));
}
}
Collections.sort(timeZones, new Comparator<TimeZone>() {
public int compare(final TimeZone t1, final TimeZone t2) {
return t1.getID().compareTo(t2.getID());
}
});
}
return timeZones;
}
public static String getName(TimeZone timeZone) {
return timeZone.getID().replaceAll("_", " ") + " - " + timeZone.getDisplayName();
}
public static void main(String[] args) {
timeZones = getTimeZones();
for (TimeZone timeZone : timeZones) {
System.out.println(getName(timeZone));
}
}
}
这段代码可能会为你做这个伎俩:
public static void main(String[] args) {
for (String timeZoneId: TimeZone.getAvailableIDs()) {
TimeZone timeZone = TimeZone.getTimeZone(timeZoneId);
// Filter out timezone IDs such as "GMT+3"; more thorough filtering is required though
if (!timeZoneId.matches(".*/.*")) {
continue;
}
String region = timeZoneId.replaceAll(".*/", "").replaceAll("_", " ");
int hours = Math.abs(timeZone.getRawOffset()) / 3600000;
int minutes = Math.abs(timeZone.getRawOffset() / 60000) % 60;
String sign = timeZone.getRawOffset() >= 0 ? "+" : "-";
String timeZonePretty = String.format("(UTC %s %02d:%02d) %s", sign, hours, minutes, region);
System.out.println(timeZonePretty);
}
}
输出如下所示:
(UTC + 09:00) 东京
但是,有一些注意事项:
我只过滤出ID与"大陆/地区"格式匹配的时区(例如"美洲/New_York")。您必须执行更彻底的过滤过程才能摆脱诸如
(UTC - 08:00) GMT+8
之类的输出。您应该阅读 TimeZone.getRawOffSet() 的文档并了解它在做什么。例如,它不考虑 DST 影响。
总的来说,您应该知道这是一种混乱的方法,主要是因为时区 ID 可以有许多不同的格式。也许您可以将自己限制为对应用程序重要的时区,并且只使用时区 ID 的键值映射来显示名称?