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

如何筛选出仅关联美国或加拿大的Java TimeZoneID?

筛选美国/加拿大专属时区ID的方法

直接通过字符串匹配America或Canada会混入南美、加勒比等地区的无关时区,要精准筛选可以参考以下两种方案:

1. 维护精准白名单(兼容Java 7及以上)

Java的时区ID遵循IANA标准,美加的合法时区ID范围是固定的,你可以直接维护一个白名单集合,从TimeZone.getAvailableIDs()结果中匹配:

  • 加拿大专属ID:Canada/Atlantic, Canada/Central, Canada/Eastern, Canada/Mountain, Canada/Newfoundland, Canada/Pacific, Canada/Saskatchewan, Canada/Yukon
  • 美国专属(含美属领地)ID:America/Anchorage, America/Adak, America/Chicago, America/Denver, America/Detroit, America/Honolulu, America/Indiana/Indianapolis, America/Indiana/Knox, America/Indiana/Marengo, America/Indiana/Petersburg, America/Indiana/Tell_City, America/Indiana/Vevay, America/Indiana/Vincennes, America/Indiana/Winamac, America/Los_Angeles, America/Miami, America/New_York, America/Phoenix, America/Juneau, America/Kentucky/Louisville, America/Kentucky/Monticello, America/Nome, America/North_Dakota/Beulah, America/North_Dakota/Center, America/North_Dakota/New_Salem, America/Sitka, America/Yakutat

实现示例:

import java.util.*;

public class TimeZoneFilter {
    public static void main(String[] args) {
        Set<String> validTimeZones = new HashSet<>(Arrays.asList(
            "Canada/Atlantic", "Canada/Central", "Canada/Eastern", 
            "America/New_York", "America/Los_Angeles", "America/Chicago"
            // 补充完整白名单ID
        ));
        
        String[] allTimeZones = TimeZone.getAvailableIDs();
        List<String> usCaTimeZones = new ArrayList<>();
        for (String id : allTimeZones) {
            if (validTimeZones.contains(id)) {
                usCaTimeZones.add(id);
            }
        }
        // 输出筛选结果
        usCaTimeZones.forEach(System.out::println);
    }
}

2. 基于时区规则关联国家验证(Java 8+)

如果使用Java 8及以上的java.timeAPI(推荐替代旧的TimeZone类),可以通过时区规则获取关联的国家代码,直接筛选美国(US)和加拿大(CA)的时区:

import java.util.*;
import java.time.ZoneId;
import java.time.zone.ZoneRules;
import java.time.zone.ZoneRulesProvider;

public class ModernTimeZoneFilter {
    public static void main(String[] args) {
        Set<String> usCaTimeZones = new HashSet<>();
        for (String zoneId : ZoneId.getAvailableZoneIds()) {
            ZoneRules rules = ZoneRulesProvider.getRules(zoneId, false);
            Set<String> countryCodes = rules.getCountryCodes();
            if (countryCodes.contains("US") || countryCodes.contains("CA")) {
                usCaTimeZones.add(zoneId);
            }
        }
        usCaTimeZones.forEach(System.out::println);
    }
}

Java 7官方文档相关内容翻译

以下内容译自Oracle Java 7官方文档:
TimeZone.getAvailableIDs()方法返回所有受支持的时区ID数组,这些ID遵循IANA时区数据库的命名规范,格式通常为区域/城市(如America/New_York)。部分时区会带有国家前缀(如Canada/Eastern),但并非所有美国/加拿大时区都包含明确的国家标识。该方法返回的ID集合涵盖全球所有时区,因此需要额外筛选才能得到特定国家/地区的时区。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 11:17:20