如何筛选出仅关联美国或加拿大的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
相关产品推荐
相关产品推荐

