1

次のようなタイムゾーン表示値が必要です。

(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));
        }
    }
}
4

1 に答える 1

3

このコードはあなたのためにトリックを行うかもしれません:

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 が「大陸/地域」の形式 (「アメリカ/ニューヨーク」など) に一致するタイムゾーンのみを除外します。などの出力を取り除くには、より徹底的なフィルタリング プロセスを実行する必要が(UTC - 08:00) GMT+8あります。

  • TimeZone.getRawOffSet()のドキュメントを読み、それが何をしているのかを理解する必要があります。たとえば、DST の影響は考慮されていません。

  • 全体として、主にタイムゾーン ID が非常に多くの異なる形式になる可能性があるため、これは厄介なアプローチであることを知っておく必要があります。アプリケーションにとって重要なタイムゾーンに制限し、タイムゾーン ID のキーと値のマッピングを表示名にするだけでよいでしょうか?

于 2012-06-07T12:42:19.387 に答える