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

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)

为什么这个方法更可靠?

  1. 自动适配locale差异:IntlDatePatternGenerator是ICU库提供的官方工具,会根据目标locale的日期格式规范生成模式,不需要你手动处理不同语言的分隔符、顺序差异。
  2. 避免字符串替换的风险:不需要去猜各个locale中日部分的写法(比如d.、d 'de'、d等),直接生成你需要的月年格式。
  3. 兼容stand-alone月份需求:通过替换MMMM为LLLL,完美保留你原来需要的独立式月份(不依赖日的月份显示形式)。

兼容性说明

IntlDatePatternGenerator从PHP 5.5.0开始可用,如果你需要兼容更早的PHP版本,可以考虑另一种方案:解析原始模式的语法节点,移除日相关的字段。但这种方法实现复杂,推荐优先使用上述方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 22:37:42