java - 时区自定义显示名称

标签 java timezone

我需要一个时区显示值如下:

(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) Tokyo

但是,有一些注意事项:

  • 我只过滤掉 ID 与格式“大陆/地区”(例如“美国/纽约”)匹配的时区。不过,您必须执行更彻底的过滤过程才能去除诸如 (UTC - 08:00) GMT+8 之类的输出。

  • 您应该阅读 TimeZone.getRawOffSet() 的文档并了解它在做什么。例如,它没有考虑夏令时的影响。

  • 总的来说,您应该知道这是一种困惑的方法,主要是因为时区 ID 可以有多种不同的格式。也许您可以将自己限制在对您的应用程序重要的时区,并且只使用时区 ID 的键值映射来显示名称?

关于java - 时区自定义显示名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10913048/

相关文章:

java - 在不同时区操作 JCalendar

java - 尽管查询正在从数据库控制台运行,但 Hibernate 抛出异常

带数据库的 Java 套接字

ios - 将 [NSDate date] 转换为本地化的 UTC 日期字符串

mongodb - 使用mongodb在UTC中存储日期时如何处理时区问题?

java - 如何在 Joda Time/Java 8 中列出时区偏移量、时区 ID 和长名称?

c# - C# 中的时区?

java - 无法找到请求目标的有效认证路径 - 链接到 github

java - fragment 旋转器不工作

java - Opencv 背景减法不检测带有小阵雪的视频的移动物体