PHP中IntlCalendar输出错误区域设置,如何根据时区获取默认区域?
问题解答:IntlCalendar时区与区域设置的误区
为什么你的代码输出en_US_POSIX
IntlCalendar::createInstance()的第一个参数只管指定时区,不会自动把时区和对应的区域设置(Locale)绑定起来。时区和区域设置是两个独立的概念:同一个时区可以对应好几种区域设置(比如Europe/Paris既可以用fr_FR,也能用法语比利时的fr_BE,甚至英语法国的en_FR)。
你创建IntlCalendar时只传了时区,没指定区域设置,它就会用PHP环境的默认区域;如果环境没配置默认区域,就会回落到ICU库的默认值en_US_POSIX,这就是你看到结果的原因。
怎么获取给定时区的默认区域设置
时区和区域设置没有强制的一对一绑定,但可以用这两种方式实现需求:
1. 手动维护时区-区域映射表
如果只涉及常见时区,直接写个映射表最靠谱,把时区和对应的常用区域设置关联起来:
$timezoneLocaleMap = [ 'Europe/Paris' => 'fr_FR', 'Asia/Shanghai' => 'zh_CN', 'America/New_York' => 'en_US', // 按需补充更多时区 ]; $targetTimezone = 'Europe/Paris'; $defaultLocale = $timezoneLocaleMap[$targetTimezone] ?? 'en_US_POSIX'; echo $defaultLocale; // 输出 fr_FR
2. 通过时区 Ident是的康推断在填充cramakingar让人per,不对,重新写:
用IntlTimeZone拿到时区对应的国家/区域代码,再结合该区域的常用语言生成区域设置:
$timezoneId = 'Europe/Paris'; $timezone = IntlTimeZone::createTimeZone($timezoneId); $regionCode = $timezone->getRegion(); // 拿到时区所属区域代码,比如 FR // 区域代码对应常用语言的映射,可根据需求扩展 $regionLangMap = [ 'FR' => 'fr', 'CN' => 'zh', 'US' => 'en', 'DE' => 'de', ]; if (isset($regionLangMap[$regionCode])) { $defaultLocale = $regionLangMap[$regionCode] . '_' . $regionCode; echo $defaultLocale; // 输出 fr_FR } else { echo 'en_US_POSIX'; // 无匹配时的默认值 }
注意:这种方式依赖区域和语言的常用关联,有些区域可能对应多种语言(比如加拿大有en_CA和fr_CA),得根据业务需求调整 fallback 逻辑。
内容的提问来源于stack exchange,提问作者Antony
相关产品推荐
相关产品推荐

