16

ユーザーの TimeZone を取得しようとしています。

このために、有効な ISO 国コードである国コードがあります。これらのコードは、ISO-3166 で定義されている大文字の 2 文字のコードです。これらのコードの完全なリストは、http: //www.chemie.fu-berlin.de/diverse/doc/ISO_3166.htmlなどの多くのサイトで見つけることができます 。

答えは「いいえ、なぜならそれは多対多の関係だからです... アメリカのような国には多くのタイムゾーンが存在する可能性があります...」. それが問題です...

私は次のようなものを試しました:

//CountryEnum contains ISO_3166 values (http://www.chemie.fu-berlin.de/diverse/doc/ISO_3166.html) 
  //List all country to test timezone:
  for (int i = 0; i < CountryEnum.values().length; i++) {
   String isoCountryCode = CountryEnum.values()[i].name();// Get the iso country code
   Locale locale = new Locale(isoCountryCode);// Build a country specific locale
   Calendar calendar = Calendar.getInstance(locale);// Build a calendar with the specific locale
   String timeZone = calendar.getTimeZone().getDisplayName();// Build a timeZone with the calendar
   System.out.println("LOCALE : "+locale+" / COUNTRY: "+isoCountryCode+" / TIMEZONE: "+timeZone);
  }

ただし、常にサーバーの TimeZone を返します...

何か案は ?

4

7 に答える 7

6

ALocaleは ではなく、TimeZoneその逆も同様です。使用しているメソッドについてはJavadocを確認してください- 最初の行には次のように書かれています

デフォルトのタイム ゾーンと指定されたロケールを使用してカレンダーを取得します。

カレンダーを取得するときにタイムゾーンを指定しなかったため、デフォルトのタイムゾーンを取得しているのはそのためです。

Jon が言ったことを考えてみてください。ユーザーが米国出身であることが判明した状況で使用したいタイムゾーンがわかっている場合はCalendar.getInstance、タイムゾーンロケールを受け取るメソッドを呼び出すことができます。一方、ここで何をするか明確に言えない場合は、実装を検討するのではなく、設計図に戻って要件についてもう少し考えてください。

前の質問に答えられない場合、ほとんどの Web サイトの標準的な手段は、ユーザーが好みのタイムゾーンを指定できるようにし (サーバーに永続的なアカウントがある場合)、そうでない場合はサーバーのタイムゾーンにデフォルト設定することだと思います。そうではないと言った。彼らが永続的なアカウントを持っておらず、時間とともに情報を提供している場合 (XML アップロードなど)、リクエストで使用しているタイムゾーンを指定するか、または (おそらくより良い)常に UTC の使用を義務付けます。

于 2009-09-07T16:00:31.347 に答える
5

これにはICU4Jを使用できます... http://helpdesk.objects.com.au/java/can-i-find-all-available-timezones-for-a-countryを参照してください

于 2012-01-17T16:35:04.877 に答える
3

その通りです。米国、ロシア、またはその他のさまざまな「大」国 (東/西) には、1 つのタイム ゾーンはありませ

米国は確かに単純な例です。どのタイム ゾーンを使用しますか? America/Los_Angeles? America/New_York? 他の何か?

于 2009-09-07T15:18:49.523 に答える
0

これを提供するものは何も知りませんが(ジョンが指摘したように、ユースケースはかなり限られています)、このデータを使用してマップを構築できます。リストはマルチマップになるので、おそらく Google Collections からそれを使用するか、独自の ISO-code->List<String>マップを使用します。

タイム ゾーン文字列を指定すると、TimeZone オブジェクトを作成してそこから移動できます。ただし、その国に複数のタイムゾーンがある場合は、それをどのように処理するかを決定する必要があります。

于 2009-09-07T15:44:26.167 に答える
-1

ここにあなたが探している解決策があります:

public String getTimeZoneByLocale(final String languageTag){
    final Locale locale = Locale.forLanguageTag(languageTag);
    final Calendar cal = Calendar.getInstance(locale);
    final TimeZone timeZone = cal.getTimeZone();
    return timeZone.getID();
}

languageTag は en_US や ru_RU のようなコードです

于 2014-12-14T11:59:06.027 に答える
-2

TZInfo gemを試しましたか?

この方法で国のタイムゾーンを取得できます。

>> TZInfo::Country.get("DE").zone_identifiers
=> ["Europe/Berlin", "Europe/Busingen"]
>> TZInfo::Country.get("CN").zone_identifiers
=> ["Asia/Shanghai", "Asia/Harbin", "Asia/Chongqing", "Asia/Urumqi", "Asia/Kashgar"]
>> TZInfo::Country.get("US").zone_identifiers
=> ["America/New_York", "America/Detroit", "America/Kentucky/Louisville",   "America/Kentucky/Monticello", "America/Indiana/Indianapolis", "America/Indiana/Vincennes", "America/Indiana/Winamac", "America/Indiana/Marengo", "America/Indiana/Petersburg", "America/Indiana/Vevay", "America/Chicago", "America/Indiana/Tell_City", "America/Indiana/Knox", "America/Menominee", "America/North_Dakota/Center", "America/North_Dakota/New_Salem", "America/North_Dakota/Beulah", "America/Denver", "America/Boise", "America/Phoenix", "America/Los_Angeles", "America/Anchorage", "America/Juneau", "America/Sitka", "America/Yakutat", "America/Nome", "America/Adak", "America/Metlakatla", "Pacific/Honolulu"]
于 2014-02-26T14:15:12.683 に答える
-2

olson データベースには、すべてのマッピングが含まれています。リンク

zone.tab ファイルを検索します。

于 2010-08-25T12:04:49.427 に答える