我有一个要求,我必须将时区从UTC转换为特定的时区,反之亦然,考虑到日光节省。我正在使用java.util.TimeZone
类。现在,问题是时区有几百个ID无法显示给用户。
作为一项解决方案,我们现在决定首先列出国家/地区列表并列出所选国家/地区的时区。我无法获得ISO country code的TimeZone
。
以下是我目前用于转换时区的代码,
Timestamp convertedTime = null;
try{
System.out.println("timezone: "+timeZone +", timestamp: "+timeStamp);
Locale locale = Locale.ENGLISH;
TimeZone destTimeZone = TimeZone.getTimeZone(timeZone);// TimeZone.getDefault();
System.out.println("Source timezone: "+destTimeZone);
DateFormat formatter = DateFormat.getDateTimeInstance(
DateFormat.DEFAULT,
DateFormat.DEFAULT,
locale);
formatter.setTimeZone(destTimeZone);
Date date = new Date(timeStamp.getTime());
System.out.println(formatter.format(date));
convertedTime = new Timestamp(date.getTime());
/*long sixMonths = 150L * 24 * 3600 * 1000;
Date inSixMonths = new Date(timeStamp.getTime() + sixMonths);
System.out.println("After 6 months: "+formatter.format(inSixMonths));
我需要找出在上面的代码中用于给定国家/地区ISO代码的时区ID。
更新:尝试了很多东西,下面的代码让我到148个条目的时区列表(仍然很大)。任何人都可以帮我缩短它。或者,建议一些其他方法来缩短时区列表或获取国家/地区的时区,
代码:
public class TimeZones {
private static final String TIMEZONE_ID_PREFIXES =
"^(Africa|America|Asia|Atlantic|Australia|Europe|Indian|Pacific)/.*";
private List<TimeZone> timeZones = null;
public List<TimeZone> getTimeZones() {
if (timeZones == null) {
initTimeZones();
}
return timeZones;
}
private void initTimeZones() {
timeZones = new ArrayList<TimeZone>();
final String[] timeZoneIds = TimeZone.getAvailableIDs();
for (final String id : timeZoneIds) {
if (id.matches(TIMEZONE_ID_PREFIXES)) {
timeZones.add(TimeZone.getTimeZone(id));
}
}
Collections.sort(timeZones, new Comparator<TimeZone>() {
public int compare(final TimeZone a, final TimeZone b) {
return a.getID().compareTo(b.getID());
}
});
}
答案 0 :(得分:3)
我认为ICU4J package会对你有帮助。
答案 1 :(得分:0)
您可以使用hasSameRules()缩短列表...这应该会将您的选择减少到大约50:
遍历 - &gt;文件相等的时区 - &gt;选择最知名的人
国家名单必须有大约200个条目,其中有很多无趣的条目,如直布罗陀或圣马丁......不喜欢这个想法
答案 2 :(得分:0)
能够让事情奏效。我创建了自己的数据库表,其中所有时区都出现在Windows操作系统及其相应的TimeZone ID中。转换是使用java.util.TimeZone类完成的。
感谢Namal和Frank提供的意见。