如何用Luxon的toHuman()将秒级Duration格式化显示分和秒?
解决Luxon秒数格式化成指定样式的方案
要实现将秒数格式化为X sec/X min/X min Y sec的样式,你可以通过配置Luxon Duration的toHuman方法参数来实现,或者使用toFormat自定义格式,以下是具体方案:
方案一:使用toHuman方法(推荐,自动适配场景)
通过指定units数组定义要显示的时间单位,配合unitDisplay设置短单位名,再关闭小数显示,就能自动处理不同时长的格式:
// 示例代码 import { Duration } from 'luxon'; // 针对不同秒数的测试 console.log(Duration.fromObject({ seconds: 25 }).toHuman({ unitDisplay: "short", units: ["minutes", "seconds"], maximumFractionDigits: 0 })); // 输出:25 sec console.log(Duration.fromObject({ seconds: 60 }).toHuman({ unitDisplay: "short", units: ["minutes", "seconds"], maximumFractionDigits: 0 })); // 输出:1 min console.log(Duration.fromObject({ seconds: 315 }).toHuman({ unitDisplay: "short", units: ["minutes", "seconds"], maximumFractionDigits: 0 })); // 输出:5 min 15 sec
参数说明:
unitDisplay: "short":指定使用短单位名(min、sec)units: ["minutes", "seconds"]:告诉Luxon需要显示分钟和秒两个单位,自动隐藏数值为0的单位maximumFractionDigits: 0:避免出现小数(比如不会显示1.5 min)
方案二:使用toFormat方法(自定义格式)
如果需要更灵活的格式控制,可以用toFormat配合条件判断:
import { Duration } from 'luxon'; function formatDuration(seconds) { const dur = Duration.fromObject({ seconds }); if (dur.as('minutes') >= 1) { return dur.toFormat("m' min 's' sec'", { suppressEmpty: true }); } else { return dur.toFormat("s' sec'"); } } // 测试 console.log(formatDuration(25)); // 25 sec console.log(formatDuration(94)); // 1 min 34 sec console.log(formatDuration(315)); // 5 min 15 sec
原代码问题分析
你之前的代码只显示秒数,是因为toHuman默认只会选择单个最适合的单位,且未指定要显示的单位范围。通过添加units参数,强制Luxon同时考虑分钟和秒单位,就能得到你想要的结果。
内容的提问来源于stack exchange,提问作者chuckd
相关产品推荐
相关产品推荐

