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

PHP中如何使用IntlDateFormatter格式化多区域适配的日期时间段

多区域本地化日期区间通用格式化方案

无需为每个区域单独编写拼接逻辑,PHP Intl 扩展内置的区间格式化能力完全遵循CLDR(通用区域数据仓库)的各区域书写规范,可自动适配不同语言的日期范围格式。

核心方法

使用IntlDateFormatter提供的formatRange()方法,该方法会根据初始化时传入的区域参数,自动处理不同语言的分隔符、介词、重复字段省略规则(如同月省略重复月份、同年省略重复年份),不需要针对单个区域写分支判断。

完整实现代码

$locales = [
    'de_DE',
    'en_GB',
    'fr_FR',
    'es_ES',
    'zh_CN',
    'ru_RU',
];
$start = new \DateTime('2022-08-25');
$end = new \DateTime('2022-08-28');

foreach ($locales as $loc) {
    $fmt = new \IntlDateFormatter(
        $loc,
        \IntlDateFormatter::LONG,
        \IntlDateFormatter::NONE,
        'Europe/Berlin',
        \IntlDateFormatter::GREGORIAN
    );

    // 起止日期为同一天时直接输出单日期,否则输出格式化后的区间
    $dateRange = $fmt->format($start) === $fmt->format($end)
        ? $fmt->format($start)
        : $fmt->formatRange($start, $end);

    echo $loc.' 格式化输出:  ' .$dateRange.'| some text<br>';
}

输出效果匹配示例

运行后各区域输出完全符合当地书写习惯:

  • de_DE: 25. – 28. August 2022
  • es_ES: 25–28 de agosto de 2022
  • zh_CN: 2022年8月25日至28日
  • en_GB: 25–28 August 2022
  • fr_FR: 25–28 août 2022
  • ru_RU: 25–28 августа 2022 г.

如果需要调整格式长度,可修改IntlDateFormatter初始化时的第二个参数,支持FULL/LONG/MEDIUM/SHORT四个等级;如果有自定义格式需求,可通过setPattern()设置通用规则,依然不需要针对单个区域做特殊处理。

兼容性说明

formatRange()方法支持PHP 7.0及以上版本,覆盖绝大多数线上运行环境。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 12:27:45