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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 03:26:06