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

Yii2框架asDuration方法格式化时长如何去除天、秒单位

Yii2 调整asDuration输出(裁剪天、秒展示段)的实现方法

Yii2的Formatter组件自带的asDuration()方法默认按「天>小时>分>秒」的单位层级拼接时长文本,要去掉天、秒的展示,有三类常用实现方案,按适配场景选择即可:

  • 全局配置方案(全项目统一生效,推荐)
    直接在应用配置(web项目对应config/web.php、控制台项目对应config/console.php)的formatter组件中,修改durationUnits属性,移除天(对应86400秒)、秒(对应1秒)的单位映射,只保留小时、分钟层级即可。配置后所有调用asDuration()的输出都会自动过滤天、秒字段,超过天的时长会自动折算为小时,秒级部分会自动舍弃。如果你的输出带「前」「后」时间后缀,说明实际调用的是asRelativeTime()方法,上述配置对它同样生效,因为该方法内部复用了同一套时长单位配置。
    配置代码示例:
    'components' => [
        'formatter' => [
            'durationUnits' => [
                // 注释移除天单位映射
                // 86400 => '天',
                3600 => '小时',
                60 => '分',
                // 注释移除秒单位映射
                // 1 => '秒',
            ],
            // 其余原有formatter配置保留即可
        ],
    ]
    
  • 单次调用临时修改配置(仅个别场景需要裁剪时用)
    如果只有少数页面/接口需要过滤天、秒展示,不想影响全局格式化逻辑,可以在调用前临时修改durationUnits配置,处理完再恢复原配置,避免污染其他逻辑。
    代码示例:
    // 提前把时长的秒级部分抹零,避免分钟数计算偏差
    $adjustedTime = intval($timePeriod / 60) * 60;
    // 保存原单位配置
    $originUnits = \Yii::$app->formatter->durationUnits;
    // 临时设置为仅展示小时、分钟
    \Yii::$app->formatter->durationUnits = [
        3600 => '小时',
        60 => '分',
    ];
    $result = \Yii::$app->formatter->asDuration($adjustedTime);
    // 恢复原配置
    \Yii::$app->formatter->durationUnits = $originUnits;
    
  • 字符串正则替换方案(快速粗暴实现)
    如果不想调整组件配置,也可以直接对asDuration()返回的字符串做正则替换,把天、秒对应的文本片段直接剔除即可。注意多语言场景下要把匹配规则里的「天」「秒」换成当前语言对应的单位文本,否则会匹配失效。
    代码示例:
    $rawDuration = \Yii::$app->formatter->asDuration($timePeriod);
    // 替换掉天、秒片段,清理多余空白字符
    $result = trim(preg_replace(['/\d+天/', '/\d+秒/'], '', $rawDuration));
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 13:27:33