web-dev-qa-db-ja.com

JavaのTimeZones

私のWebアプリのユーザーは、選択したタイムゾーンに基づいてイベントをスケジュールできます。

タイムゾーンの適切なリストをエンドユーザーに提示し、それをサーバーエンドで_Java.util.TimeZone_オブジェクトに簡単に変換したい。

String[] TimeZone.getAvailableIds()は私が使用できるものですが、問題は約585のタイムゾーンIDを出力することです。

ユーザーにタイムゾーンの簡単なリスト(タイムゾーン設定のWindowsボックスのように)を提示し、そのIDを使用してサーバーエンドでTimeZoneオブジェクトに簡単に変換する最良の方法は何ですか?

26
Vish

タイムゾーンのリストは、アプリケーションおよびロケール固有です。ユーザーに最も適切なゾーンを知っているのはあなただけです。実際には、地域ごとに異なるリストがあります。

参考までに、米国のユーザー向けのリストを以下に示します。

    "Pacific/Midway",
    "US/Hawaii",
    "US/Alaska",
    "US/Pacific",
    "America/Tijuana",
    "US/Arizona",
    "America/Chihuahua",
    "US/Mountain",
    "America/Guatemala",
    "US/Central",
    "America/Mexico_City",
    "Canada/Saskatchewan",
    "America/Bogota",
    "US/Eastern",
    "US/East-Indiana",
    "Canada/Eastern",
    "America/Caracas",
    "America/Manaus",
    "America/Santiago",
    "Canada/Newfoundland",
    "Brazil/East",
    "America/Buenos_Aires",
    "America/Godthab",
    "America/Montevideo",
    "Atlantic/South_Georgia",
    "Atlantic/Azores",
    "Atlantic/Cape_Verde",
    "Africa/Casablanca",
    "Europe/London",
    "Europe/Berlin",
    "Europe/Belgrade",
    "Europe/Brussels",
    "Europe/Warsaw",
    "Africa/Algiers",
    "Asia/Amman",
    "Europe/Athens",
    "Asia/Beirut",
    "Africa/Cairo",
    "Africa/Harare",
    "Europe/Helsinki",
    "Asia/Jerusalem",
    "Europe/Minsk",
    "Africa/Windhoek",
    "Asia/Baghdad",
    "Asia/Kuwait",
    "Europe/Moscow",
    "Africa/Nairobi",
    "Asia/Tbilisi",
    "Asia/Tehran",
    "Asia/Muscat",
    "Asia/Baku",
    "Asia/Yerevan",
    "Asia/Kabul",
    "Asia/Yekaterinburg",
    "Asia/Karachi",
    "Asia/Calcutta",
    "Asia/Colombo",
    "Asia/Katmandu",
    "Asia/Novosibirsk",
    "Asia/Dhaka",
    "Asia/Rangoon",
    "Asia/Bangkok",
    "Asia/Krasnoyarsk",
    "Asia/Hong_Kong",
    "Asia/Irkutsk",
    "Asia/Kuala_Lumpur",
    "Australia/Perth",
    "Asia/Taipei",
    "Asia/Tokyo",
    "Asia/Seoul",
    "Asia/Yakutsk",
    "Australia/Adelaide",
    "Australia/Darwin",
    "Australia/Brisbane",
    "Australia/Sydney",
    "Pacific/Guam",
    "Australia/Hobart",
    "Asia/Vladivostok",
    "Asia/Magadan",
    "Pacific/Auckland",
    "Pacific/Fiji",
    "Pacific/Tongatapu",
24
ZZ Coder

Windowsのタイムゾーン(Windowsのタイムゾーン選択ダイアログのゾーン)のリストとそれに関連するJava TimeZoneオブジェクトを提供する小さなJavaユーティリティを作成しました。 を参照してくださいhttps://github.com/nfergu/Java-Time-Zone-List

これは http://unicode.org/repos/cldr/trunk/common/supplemental/windowsZones.xml のCLDRマッピングに基づいています。

11
Neil

次の正規表現のみに一致するTZ IDを使用してリストを減らすことができます

^(Africa|America|Asia|Atlantic|Australia|Europe|Indian|Pacific)/.*
4
tbruyelle

Tbruyelleの回答を補足するために、さらにいくつかの国(カナダなど)を追加し、フィルターの「/」部分を削除して、リストをソートする手段を提供しました。

public static void main(String[] args)
{
    List<String> simplifiedTimezoneList = getTimezoneIdList();

    for (String tz : simplifiedTimezoneList)
        System.out.println(tz);
}

public static List<String> getTimezoneIdList()
{
    String[] temp = TimeZone.getAvailableIDs();
    List<String> timezoneList = new ArrayList<String>();
    List<String> simplifiedTimezoneList = new ArrayList<String>();
    for (String tz : temp)
    {
        timezoneList.add(tz);
    }
    Collections.sort(timezoneList);
    String filterList = "Canada|Mexico|Chile|Cuba|Brazil|Japan|Turkey|Mideast|Africa|America|Asia|Atlantic|Australia|Europe|Indian|Pacific";
    Pattern p = Pattern.compile("^(" + filterList + ").*");
    for (String tz : timezoneList)
    {
        Matcher m = p.matcher(tz);
        if (m.find())
        {
            simplifiedTimezoneList.add(tz);
        }
    }
    return simplifiedTimezoneList;
}
3
Bryan

もう所有していない会社のためにコードを提供できません。 Windows上のJVMには、WindowsタイムゾーンをJavaのzoneinfoベースの大陸/都市形式にマップするtzmappingsC:\Program Files\Java\jre6\libまたは類似のものを参照)というファイルが付属しています。

残念ながら、tzmappingsのテキスト名はひどいため、数分の集計を行う必要があります。 regeditを開き、HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zonesに移動します。この下には、マシンの各タイムゾーンのキーがあります。 Windows 7には約90があります。各キーにはDisplayという値があり、これは必要なテキスト名です。 tzmappingsでキー自体を探し、それぞれのJavaタイムゾーン識別子を見つけます。

0
Andrew Duffy

「GMT +/-時間」表記(分をスキップ)を使用したカスタムタイムゾーンIDのリストを使用できませんか?

(編集:私の最初の提案では、夏時間への移行は自動ではありません。この問題に対処するには、まずユーザーにGMTオフセットを選択してから、指定したオフセットのタイムゾーンIDの(リンクされた)リストを表示することができます。

public static String[] getAvailableIDs(int rawOffset) 

このようにして、ユーザーはshorterリストでユーザーのタイムゾーンを選択し(ユーザーエクスペリエンスにとってはより良い)、夏時間の動作から恩恵を受けることができます。)

0
Pascal Thivent

リストの外観を正確に選択するための細分性が必要な場合、私は見つけることができる最高のハードコードされたリストを使用し( これは良い例です )、それが表示され、正確に変換されることを確認します可能。

これらの585のタイムゾーンにはそれぞれ意味(DSTなど)があり、ユーザーはそれらに最適なタイムゾーンを選択する場合があることに注意してください。リストはもっと短くなる可能性があることには同意しますが。

0
Yuval Adam

その数が多ければ、それらを選択ボックスリストに追加しようとはしません...別のモーダルダイアログ(または必要に応じてポップアップ)のリストに配置し、ユーザーがスクロールしてクリックできるようにします彼らが望む名前。モーダルダイアログのリンクをクリックすると、テキストフィールドに正しいコードが入力され、サーバーに送信できます。

さらに良いことに、世界地図上で自分の場所をクリックし、イメージマップを使用してその場所を適切なタイムゾーンに変換します。

0
Spike Williams