Java 如何获取指定ISO国家代码的时区id?

Java 如何获取指定ISO国家代码的时区id?,java,timezone,Java,Timezone,我有一个要求,我必须将时区从UTC转换为特定时区,反之亦然,同时考虑到日光节约。我正在为它使用java.util.TimeZone类。现在,问题是有几百个时区ID不能显示给用户 作为解决办法,我们决定先列出国家列表,然后列出选定国家的时区。我无法获取某个时间段的时区 这是我目前用来转换时区的代码 Timestamp convertedTime = null; try{ System.out.println("timezone: "+timeZone +", timestamp: "+timeSt

我有一个要求,我必须将时区从UTC转换为特定时区,反之亦然,同时考虑到日光节约。我正在为它使用
java.util.TimeZone
类。现在,问题是有几百个时区ID不能显示给用户

作为解决办法,我们决定先列出国家列表,然后列出选定国家的时区。我无法获取某个时间段的
时区

这是我目前用来转换时区的代码

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));
我需要找出时区Id将用于上述代码为给定国家的ISO代码


更新:尝试了很多东西,下面的代码让我看到了包含148个条目的时区列表(仍然很大)。谁能帮我把它缩短一点吗。或者,建议其他一些方法,要么缩短时区列表,要么获取一个国家的时区

代码:

公共类时区{
专用静态最终字符串时区\u ID\u前缀=
“^(非洲|美洲|亚洲|大西洋|澳大利亚|欧洲|印度|太平洋)/.*”;
私有列表时区=空;
公共列表getTimeZones(){
如果(时区==null){
初始化时区();
}
返回时区;
}
专用时区(){
时区=新的ArrayList();
最后一个字符串[]timeZoneIds=TimeZone.getAvailableIDs();
for(最终字符串id:TimeZoneID){
if(id.matches(时区\u id\u前缀)){
添加(TimeZone.getTimeZone(id));
}
}
Collections.sort(时区、新比较器(){
公共整数比较(最终时区a、最终时区b){
返回a.getID().compareTo(b.getID());
}
});
}

我想这会对您有所帮助。

您可以使用hasSameRules()缩短列表……这将使您的选择减少到大约50个:

迭代->文件等时区->选择最易识别的时区


国家/地区列表必须有大约200个条目,其中包含大量不感兴趣的条目,如直布罗陀或圣马丁……不喜欢这个想法。

能够使事情正常运行。我创建了自己的数据库表,其中包含windows操作系统中显示的所有时区及其相应的时区ID。转换使用java.util.TimeZone cl完成屁股


感谢Namal和Frank的投入。

感谢Namal的及时回复,尼斯图书馆。但当我与我们测试相同的国家代码时,它给了我一个很大的时区列表(大约50个)。根据我目前的理解,我们有四个时区(如果我错了,请纠正我)嘿,伙计们,我必须尽快完成这项任务。如果有人能帮我剪短我的时区ID列表,请请求我缩短我的时区ID。@ USS1414720:我很久以前就用过这个图书馆。如果我们不考虑夏威夷时间和阿拉斯加时间,那么有4个时区作为美国的太平洋时间、山地时间、中央时间和Eastern Tim。e、 你能给我们美国的时区列表吗?然后我们可以检查到底发生了什么。纳马尔,下面是我得到的美国国家代码的时区列表,AST,America/Adak,America/Anchorage,America/Atka,America/Boise,America/Chicago,America/Denver,America/Detroit,America/Fort_Wayne,America/Indianapolis,America/印第安纳州/诺克斯,美国/印第安纳州/马伦戈,美国/印第安纳州/彼得堡,美国/印第安纳州/泰尔尤市,美国/印第安纳州/文森斯,美国/印第安纳州/维纳马克,美国/印第安纳波利斯,美国/朱诺,美国/肯塔基州/路易斯维尔,美国/肯塔基州/蒙蒂塞洛,美国/诺克斯尤因,美国/洛杉矶,美国/路易斯维尔,美国/梅诺米东北、美国/梅特拉卡特拉、美国/纽约、美国/诺姆、美国/北达科他/比乌拉、美国/北达科他/中心、美国/北达科他/新塞勒姆、美国/菲尼克斯、美国/希普洛克、美国/锡特卡、美国/雅库塔、CST、IET、纳瓦霍、PNT、PST、太平洋/檀香山、美国/阿拉斯加、美国/阿留申群岛、美国/亚利桑那州、美国/中部、美国/东印第安纳州、美国/东部astern,美国/夏威夷,美国/印第安纳州Starke,美国/密歇根,美国/Mountain,美国/太平洋,美国/太平洋NewHey Frank,你能稍微解释一下吗?如果你指的是国家列表或时区列表,我有点困惑,这到底是如何实现的。谢谢。因为java.util timezone东西提供了一种比较方法(hasSameRules)您可以将690个时间码分组,并将它们减少到40到50个可识别的时间码…嗨,弗兰克,谢谢您的回复。我尝试了您提到的内容。但是,在使用hasSameRules后,它返回了我428个时区的列表。代码如下,用于(int I=0;Ipublic 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()); } }); }