PHP 8.1 中替代已废弃 strftime() 的国际化日期格式化方案

17次阅读

PHP 8.1 中替代已废弃 strftime() 的国际化日期格式化方案

php 8.1 起 `strftime()` 函数已被正式弃用,推荐使用 `intldateformatter::formatobject()` 结合 `datetime` 实现跨语言、符合 icu 标准的日期格式化,支持本地化全月名(如法语“avril”、中文“四月”等)。

php 8.1+ 中,strftime() 已被标记为 deprecated(弃用),因其依赖系统区域设置(locale),行为不可靠且不兼容 windows 和容器化环境。取而代之的是基于 ICU(International Components for Unicode)的 IntlDateFormatter 类——它提供标准化、可移植、多语言安全的日期格式化能力。

✅ 推荐替代方案:IntlDateFormatter::formatObject()

该方法接受 DateTime 对象、ICU 日期模式字符串和目标 locale,无需手动设置系统 locale,即可精准输出本地化月份名称(如 %B 对应的“January”/“一月”/“janvier”)。

? 基础示例(修复原代码)

原写法(PHP

$date = strftime("%e %B %Y", strtotime('2010-01-08')); // → " 8 January 2010"

✅ 正确迁移写法(PHP 8.1+):

立即学习PHP免费学习笔记(深入)”;

// 创建 DateTime 对象(注意:strtotime() 返回时间戳,需转为 DateTime) $dateTime = new DateTime('2010-01-08');  // 使用 IntlDateFormatter::formatObject 格式化('fr' 表示法语,'zh' 表示中文,'en' 表示英语等) $dateFormatted = IntlDateFormatter::formatObject(     $dateTime,     'd MMMM y',   // ICU 模式:d=日(无前导零),MMMM=全月名,y=年份     'en'          // 目标语言环境(locale) );  echo $dateFormatted; // → "8 January 2010"

? 多语言支持示例

$dateTime = new DateTime('2010-01-08');  // 法语 echo IntlDateFormatter::formatObject($dateTime, 'd MMMM y', 'fr'); // → "8 janvier 2010"  // 中文(简体) echo IntlDateFormatter::formatObject($dateTime, 'y年M月d日', 'zh'); // → "2010年1月8日"  // 日语 echo IntlDateFormatter::formatObject($dateTime, 'y年M月d日', 'ja'); // → "2010年1月8日"

⚠️ 注意事项: 确保 intl 扩展已启用(PHP 编译时需含 ICU 支持;linux 下常通过 apt install php-intl 安装); ICU 模式与 strftime() 不同:%B → MMMM,%e → d,%Y → y;完整符号表参考 ICU Date Field symbol table; DateTime 构造时建议显式指定时区(如 new DateTime(‘2010-01-08’, new DateTimeZone(‘UTC’))),避免隐式依赖 date_default_timezone_set(); 若需首字母大写(如 “January” 而非 “january”),法语/德语等语言不适用 ucwords()(会破坏大小写规则),应依赖 ICU 本地化本身输出正确格式。

✅ 总结

strftime() 的退出标志着 PHP 向标准化国际化迈进。使用 IntlDateFormatter::formatObject() 不仅解决弃用警告,更带来稳定、可测试、多语言就绪的日期处理能力。从今天起,请将所有 strftime() 调用重构为基于 DateTime + IntlDateFormatter 的组合——这是 PHP 8.1+ 及未来版本的官方推荐路径。

text=ZqhQzanResources