以下方法可行。
import java.util.Set;
import java.util.TimeZone;
import org.joda.time.DateTimeZone;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
Set<String> zoneIds = DateTimeZone.getAvailableIDs();
DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern("ZZ");
for (String zoneId : zoneIds) {
String offset = dateTimeFormatter.withZone(DateTimeZone.forID(zoneId)).print(0);
String longName = TimeZone.getTimeZone(zoneId).getDisplayName();
System.out.println("(" + offset + ") " + zoneId + ", " + longName);
}
现在我可能不知道其他更好的方法,但也有可能存在其他更好的方法。
或者
import java.util.Set;
import org.joda.time.DateTimeUtils;
import org.joda.time.DateTimeZone;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
Set<String> zoneIds = DateTimeZone.getAvailableIDs();
DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern("ZZ");
for (String zoneId : zoneIds) {
String offset = dateTimeFormatter.withZone(DateTimeZone.forID(zoneId)).print(0);
String longName = DateTimeZone.forID(zoneId).getName(DateTimeUtils.currentTimeMillis());
System.out.println("(" + offset + ") " + zoneId + ", " + longName);
}
对于格林威治标准时间(例如Etc/GMT+0
),它将显示+00:00
而不是像第一种情况中显示的GMT+00:00
。
如果此区域设置中不可用名称,则此方法(public final String getName(long instant)
)返回格式为[+-]hh:mm的字符串。
如果需要,还可以使用适当的Locale
,使用重载方法。
public String getName(long instant, Locale locale)
例如,协调世界时的简称UTC可以显示如下。
import java.util.Set;
import org.joda.time.DateTimeUtils;
import org.joda.time.DateTimeZone;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
Set<String> zoneIds = DateTimeZone.getAvailableIDs();
DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern("ZZ");
for (String zoneId : zoneIds) {
String offset = dateTimeFormatter.withZone(DateTimeZone.forID(zoneId)).print(0);
String shortName = DateTimeZone.forID(zoneId).getShortName(DateTimeUtils.currentTimeMillis());
System.out.println("(" + offset + ") " + zoneId + ", " + shortName);
}
使用适当的Locale
,如果需要可以使用重载方法。
public String getShortName(long instant, Locale locale)
更新:
在Java SE 8中使用Java时间API,进一步简化了这一过程。
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.time.format.TextStyle;
import java.util.Locale;
import java.util.Set;
Set<String> zoneIds = ZoneId.getAvailableZoneIds();
for (String zoneId : zoneIds) {
ZoneId zone = ZoneId.of(zoneId);
ZonedDateTime zonedDateTime = ZonedDateTime.now(zone);
ZoneOffset offset = zonedDateTime.getOffset();
String longName = zone.getDisplayName(TextStyle.FULL, Locale.ENGLISH);
System.out.println("(" + offset + ") " + zoneId + ", " + longName);
}
在java.time.format.TextStyle
中有多种可用的显示名称样式,例如可以使用TextStyle.SHORT
来显示缩写。
zone.getDisplayName(TextStyle.FULL, Locale.ENGLISH)
将显示长名称,例如“India Time”。但是,这不是像Joda Time那样的全名。
以下代码将显示给定名称的完整名称,例如“India Standard Time”(适用时)。
DateTimeFormatter pattern = DateTimeFormatter.ofPattern("zzzz");
String longName = pattern.format(ZonedDateTime.now(ZoneId.of(zoneId)));
以下将显示给定时区的区域偏移,例如
GMT+05:30
(注意模式的大写)。
DateTimeFormatter pattern = DateTimeFormatter.ofPattern("ZZZZ")
String longName = pattern.format(ZonedDateTime.now(ZoneId.of(zoneId)))
以下内容是用于显示缩写。
DateTimeFormatter pattern = DateTimeFormatter.ofPattern("zzz");
String longName = pattern.format(ZonedDateTime.now(ZoneId.of(zoneId)));
用于表示区偏移量的大写字母 ZZZ
,例如 +0530
, +0000
。
https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html