
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+ 及未来版本的官方推荐路径。











