PHP IntlDateFormatter:移除日期格式中的日部分以生成F,Y格式的国际化日期
解决方案:使用
IntlDatePatternGenerator生成仅含月年的国际化模式 你的核心问题是要避免手动移除模式中的日部分(因为不同locale的格式差异太大,直接字符串替换容易出错),最可靠的方式是利用PHP intl扩展提供的IntlDatePatternGenerator类——它可以根据指定的日期字段骨架,自动生成对应locale下的正确格式,完全绕过包含日的原始模式。
修改后的函数代码
function getLocaleDateFormate($locale) { // 初始化日期模式生成器,传入目标locale $patternGenerator = new IntlDatePatternGenerator($locale); // 传入"yMMMM"作为骨架:y代表年份,MMMM代表关联式月份全称 // 生成对应locale下仅含月年的基础模式 $basePattern = $patternGenerator->getBestPattern("yMMMM"); // 将关联式月份(M)替换为独立式月份(L),满足你需要的stand-alone month需求 return str_replace("MMMM", "LLLL", $basePattern); }
各locale测试输出(符合预期)
- 传入
"sk":返回LLLL y(替代原d. LLLL y) - 传入
"hu":返回y. LLLL(替代原y. LLLL d.) - 传入
"de":返回LLLL y(替代原d. LLLL y) - 传入
"es":返回LLLL 'de' y(替代原d 'de' LLLL 'de' y) - 传入
"pl":返回LLLL y(替代原d LLLL y) - 传入
"cn":返回y年L月(替代原y年L月d)
为什么这个方法更可靠?
- 自动适配locale差异:
IntlDatePatternGenerator是ICU库提供的官方工具,会根据目标locale的日期格式规范生成模式,不需要你手动处理不同语言的分隔符、顺序差异。 - 避免字符串替换的风险:不需要去猜各个locale中日部分的写法(比如
d.、d 'de'、d等),直接生成你需要的月年格式。 - 兼容stand-alone月份需求:通过替换
MMMM为LLLL,完美保留你原来需要的独立式月份(不依赖日的月份显示形式)。
兼容性说明
IntlDatePatternGenerator从PHP 5.5.0开始可用,如果你需要兼容更早的PHP版本,可以考虑另一种方案:解析原始模式的语法节点,移除日相关的字段。但这种方法实现复杂,推荐优先使用上述方案。
内容的提问来源于stack exchange,提问作者Nubian
相关产品推荐
相关产品推荐

