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
相关产品推荐
相关产品推荐

