You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中如何从时区ID获取国家代码?获取指定ZoneId对应的ISO国家码数组

获取ZoneId对应的ISO国家代码数组

嘿,这个需求其实挺常见的,我来给你捋捋怎么实现。Java 8+的时区API里没有直接提供ZoneId到国家代码的映射方法,但我们可以通过遍历所有ISO国家代码,反向匹配对应时区的方式来达成目标。

具体思路很简单:

  • 先拿到所有标准的ISO 3166-1 alpha-2国家代码
  • 对每个国家代码,获取它对应的所有时区ID集合
  • 检查这些时区ID是否包含我们目标的ZoneId,匹配上就把这个国家代码加入结果列表
  • 最后把列表转成String[]即可

直接上可运行的代码示例,一看就懂:

import java.time.ZoneId;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.TimeZone;
import java.util.Calendar;

public class ZoneCountryMatcher {
    public static void main(String[] args) {
        // 你的原始代码,获取当前系统时区的ZoneId
        ZoneId zoneId = Calendar.getInstance().getTimeZone().toZoneId();
        
        // 调用方法获取对应的ISO国家代码数组
        String[] matchingCountryCodes = getIsoCountriesForZoneId(zoneId);
        
        // 打印结果示例
        for (String code : matchingCountryCodes) {
            System.out.println("匹配的国家代码:" + code);
        }
    }

    /**
     * 根据目标ZoneId获取对应的ISO国家代码数组
     */
    public static String[] getIsoCountriesForZoneId(ZoneId targetZoneId) {
        List<String> matchingCountries = new ArrayList<>();
        String targetZoneIdStr = targetZoneId.getId();

        // 获取所有ISO标准国家代码(alpha-2格式,比如"CN"、"US")
        String[] allIsoCountries = Locale.getISOCountries();

        for (String countryCode : allIsoCountries) {
            // 获取当前国家对应的所有时区ID
            String[] countryTimeZoneIds = TimeZone.getAvailableIDs(countryCode);
            
            // 检查该国家的时区是否包含目标ZoneId
            for (String tzId : countryTimeZoneIds) {
                if (tzId.equals(targetZoneIdStr)) {
                    matchingCountries.add(countryCode);
                    break; // 找到匹配就跳出当前循环,不用检查该国家的其他时区
                }
            }
        }

        // 将列表转换为String数组返回
        return matchingCountries.toArray(new String[0]);
    }
}

补充说明:

  • TimeZone.getAvailableIDs(String countryCode)方法会返回指定国家对应的所有时区ID,比如澳大利亚会返回["Australia/Sydney", "Australia/Melbourne", ...]这类值
  • 我们用ZoneId.getId()转成字符串来匹配,是因为Java 8+的ZoneId完全兼容旧版TimeZone的ID体系,二者是一一对应的
  • 如果你的业务场景需要频繁调用这个方法,可以提前把国家和时区的映射关系缓存起来,避免每次都遍历所有国家,提升性能

内容的提问来源于stack exchange,提问作者SABER

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:14:49