我想构建一个时区列表,以显示给用户选择。显示名称必须如下:
( 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?
答案 0 :(得分: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
和5:30
。 String.format()
的使用使得在阅读代码时更容易确定最终字符串。使用TimeUnit
类简化了数学运算。
答案 1 :(得分: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。
答案 2 :(得分: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());
}
答案 3 :(得分: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;
}
答案 4 :(得分:0)
只需使用SimpleDateFormat
时区模式的XXX
(生成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