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:005: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 小时时显示一位数字。显示为 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

只需将 aSimpleDateFormatXXX时区模式一起使用(生成 ISO 8601 时区)

    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 回答