2

タイムゾーンリストを作成して、ユーザーが選択できるように表示したいと思います。表示名は次のようにする必要があります。

( GMT 5:30 ) India Standard Time(Asia/Calcutta)

私はすべてのタイムゾーンを使用しTimeZone.getAvailableIDs()てリストを作成しています。私が書いたコードは次のとおりです。

String[] timeZones = TimeZone.getAvailableIDs();
List<String> tzList = new ArrayList<String>();
for (String timeZone : timeZones)
{
  TimeZone tz = TimeZone.getTimeZone(timeZone);
  StringBuilder timeZoneStr = new StringBuilder();
  timeZoneStr.append("( GMT ").append(tz.getRawOffset() / (60 * 60 * 1000)).append(" ) ").append(tz.getDisplayName()).append("(").append(timeZone).append(")");
  tzList.add(timeZoneStr.toString());
  System.out.println(timeZoneStr.toString());
}

出力のスニペットは次のようになります。

( GMT 5 ) Maldives Time(Indian/Maldives)
( GMT 5 ) Pakistan Time(PLT)
( GMT 5 ) India Standard Time(Asia/Calcutta)
( GMT 5 ) India Standard Time(Asia/Kolkata)
( GMT 5 ) India Standard Time(IST)

しかし、私が取得する必要のある出力は次のとおりです。

( GMT 5:0 ) Maldives Time(Indian/Maldives)
( GMT 5:0 ) Pakistan Time(PLT)
( GMT 5:30 ) India Standard Time(Asia/Calcutta)
( GMT 5:30 ) India Standard Time(Asia/Kolkata)
( GMT 5:30 ) India Standard Time(IST)

5:30を取得するにはどうすればよいですか?

4

5 に答える 5

6

より読みやすい答えは次のとおりです。

for (String timeZone : timeZones) {
  TimeZone tz = TimeZone.getTimeZone(timeZone);

  long hours = TimeUnit.MILLISECONDS.toHours(tz.getRawOffset());
  long minutes = TimeUnit.MILLISECONDS.toMinutes(tz.getRawOffset())
      - TimeUnit.HOURS.toMinutes(hours);

  String timeZoneString = String.format("( GMT %d:%02d ) %s(%s)", hours,
      minutes, tz.getDisplayName(), timeZone);
  tzList.add(timeZoneString);
  System.out.println(timeZoneString);
}

5:00これにより、egとも正しく表示されます5:30。を使用するとString.format()、コードを読み取るときに最終的な文字列を簡単に判別できます。クラスを使用すると、計算がTimeUnit簡単になります。

于 2013-03-12T14:01:05.977 に答える
2

適切なフォーマットの別の解決策:

DateFormat fmt = new SimpleDateFormat("HH:mm");
fmt.setTimeZone(TimeZone.getTimeZone("UTC"));

List<String> tzList = new ArrayList<String>();
for (String timeZone : TimeZone.getAvailableIDs()) {   
    TimeZone tz = TimeZone.getTimeZone(timeZone);

    StringBuilder timeZoneStr = new StringBuilder();
    timeZoneStr.append("( GMT ");
    if (tz.getRawOffset() < 0) {
        timeZoneStr.append("-");
    }
    timeZoneStr.append(fmt.format(new Date(Math.abs(tz.getRawOffset()))));
    timeZoneStr.append(" ) ").append(tz.getDisplayName()).append(timeZone).append(")");

    tzList.add(timeZoneStr.toString());
    System.out.println(timeZoneStr.toString());
}
于 2013-03-12T14:01:22.230 に答える
2

タイムゾーン形成ラインを次のように切り替える必要があります。

timeZoneStr.append("( GMT ").append(tz.getRawOffset() / (60 * 60 * 1000)).append(":").append((tz.getRawOffset() / (60 * 1000))%60).append(" ) ").append(tz.getDisplayName()).append("(").append(timeZone).append(")");

これがあなたが探している答えだと思います。ただし、時間オフセットがたとえば12時間の場合、1桁しか表示されないため、分をフォーマットすることはできます。12:0として表示されます。

于 2013-03-12T13:52:49.910 に答える
0

以下の方法を使用してタイムゾーンをオフセットします。

private static String displayTimeZone(TimeZone tz) {

    long hours = TimeUnit.MILLISECONDS.toHours(tz.getRawOffset());
    long minutes = TimeUnit.MILLISECONDS.toMinutes(tz.getRawOffset()) 
                              - TimeUnit.HOURS.toMinutes(hours);
    // avoid -4:-30 issue
    minutes = Math.abs(minutes);

    String result = "";
    if (hours > 0) {
        result = String.format("(GMT+%d:%02d) %s", hours, minutes, tz.getID());
    } else {
        result = String.format("(GMT%d:%02d) %s", hours, minutes, tz.getID());
    }

    return result;

}
于 2015-07-05T06:15:52.723 に答える
0

タイムゾーンパターンSimpleDateFormatでを使用するだけです(ISO 8601タイムゾーンを生成します)XXX

    DateFormat gmt = new SimpleDateFormat("'GMT' XXX");
    for (TimeZone tz : timeZones) {
        gmt.setTimeZone(tz);
        String gmtTimezone = gmt.format(new Date());
        System.err.println(tz.getID() + " " + gmtTimezone);
    }

ソース:http ://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html#iso8601timezone

于 2016-08-24T09:36:44.540 に答える