私のWebアプリのユーザーは、選択したタイムゾーンに基づいてイベントをスケジュールできます。
タイムゾーンの適切なリストをエンドユーザーに提示し、それをサーバーエンドで_Java.util.TimeZone
_オブジェクトに簡単に変換したい。
String[] TimeZone.getAvailableIds()
は私が使用できるものですが、問題は約585のタイムゾーンIDを出力することです。
ユーザーにタイムゾーンの簡単なリスト(タイムゾーン設定のWindowsボックスのように)を提示し、そのIDを使用してサーバーエンドでTimeZoneオブジェクトに簡単に変換する最良の方法は何ですか?
タイムゾーンのリストは、アプリケーションおよびロケール固有です。ユーザーに最も適切なゾーンを知っているのはあなただけです。実際には、地域ごとに異なるリストがあります。
参考までに、米国のユーザー向けのリストを以下に示します。
"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",
Windowsのタイムゾーン(Windowsのタイムゾーン選択ダイアログのゾーン)のリストとそれに関連するJava TimeZoneオブジェクトを提供する小さなJavaユーティリティを作成しました。 を参照してくださいhttps://github.com/nfergu/Java-Time-Zone-List
これは http://unicode.org/repos/cldr/trunk/common/supplemental/windowsZones.xml のCLDRマッピングに基づいています。
次の正規表現のみに一致するTZ IDを使用してリストを減らすことができます
^(Africa|America|Asia|Atlantic|Australia|Europe|Indian|Pacific)/.*
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;
}
もう所有していない会社のためにコードを提供できません。 Windows上のJVMには、WindowsタイムゾーンをJavaのzoneinfoベースの大陸/都市形式にマップするtzmappings
(C:\Program Files\Java\jre6\lib
または類似のものを参照)というファイルが付属しています。
残念ながら、tzmappings
のテキスト名はひどいため、数分の集計を行う必要があります。 regeditを開き、HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones
に移動します。この下には、マシンの各タイムゾーンのキーがあります。 Windows 7には約90があります。各キーにはDisplay
という値があり、これは必要なテキスト名です。 tzmappings
でキー自体を探し、それぞれのJavaタイムゾーン識別子を見つけます。
「GMT +/-時間」表記(分をスキップ)を使用したカスタムタイムゾーンIDのリストを使用できませんか?
(編集:私の最初の提案では、夏時間への移行は自動ではありません。この問題に対処するには、まずユーザーにGMTオフセットを選択してから、指定したオフセットのタイムゾーンIDの(リンクされた)リストを表示することができます。
public static String[] getAvailableIDs(int rawOffset)
このようにして、ユーザーはshorterリストでユーザーのタイムゾーンを選択し(ユーザーエクスペリエンスにとってはより良い)、夏時間の動作から恩恵を受けることができます。)
リストの外観を正確に選択するための細分性が必要な場合、私は見つけることができる最高のハードコードされたリストを使用し( これは良い例です )、それが表示され、正確に変換されることを確認します可能。
これらの585のタイムゾーンにはそれぞれ意味(DSTなど)があり、ユーザーはそれらに最適なタイムゾーンを選択する場合があることに注意してください。リストはもっと短くなる可能性があることには同意しますが。
その数が多ければ、それらを選択ボックスリストに追加しようとはしません...別のモーダルダイアログ(または必要に応じてポップアップ)のリストに配置し、ユーザーがスクロールしてクリックできるようにします彼らが望む名前。モーダルダイアログのリンクをクリックすると、テキストフィールドに正しいコードが入力され、サーバーに送信できます。
さらに良いことに、世界地図上で自分の場所をクリックし、イメージマップを使用してその場所を適切なタイムゾーンに変換します。