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

如何用DayJS或自定义函数轻松格式化DateTime Duration?

解决DayJS格式化ISO 8601 Duration为自然语言字符串的问题

DayJS原生确实没有直接将ISO 8601 Duration(如PT1H、P14D)转换为类似“1 Hour”“14 days”这类自然语言格式的内置方法,你可以通过以下两种方式实现需求:

方法一:手动解析ISO Duration字符串

直接用正则表达式提取Duration中的各时间单位数值,再拼接成目标格式。这种方式无需额外插件,轻量灵活:

function formatDuration(isoDuration) {
  // 匹配ISO 8601 Duration格式,提取年、月、日、时、分、秒数值
  const durationMatch = isoDuration.match(/P(?:(\d+)Y)?(?:(\d+)M)?(?:(\d+)D)?T?(?:(\d+)H)?(?:(\d+)M)?(?:(\d+)S)?/);
  if (!durationMatch) return '';

  const [, years, months, days, hours, minutes, seconds] = durationMatch;
  const resultParts = [];

  // 根据数值是否存在,添加对应单位文本(处理单复数)
  if (years) resultParts.push(`${years} ${years === '1' ? 'year' : 'years'}`);
  if (months) resultParts.push(`${months} ${months === '1' ? 'month' : 'months'}`);
  if (days) resultParts.push(`${days} ${days === '1' ? 'day' : 'days'}`);
  if (hours) resultParts.push(`${hours} ${hours === '1' ? 'hour' : 'hours'}`);
  if (minutes) resultParts.push(`${minutes} ${minutes === '1' ? 'minute' : 'minutes'}`);
  if (seconds) resultParts.push(`${seconds} ${seconds === '1' ? 'second' : 'seconds'}`);

  return resultParts.join(', ');
}

// 测试示例
console.log(formatDuration('PT1H')); // 输出:"1 hour"
console.log(formatDuration('PT30M')); // 输出:"30 minutes"
console.log(formatDuration('P14D')); // 输出:"14 days"
console.log(formatDuration('P1Y2M3DT4H5M6S')); // 输出:"1 year, 2 months, 3 days, 4 hours, 5 minutes, 6 seconds"

方法二:结合DayJS Duration插件

如果需要处理更复杂的Duration(如带小数的PT1.5H),可以借助DayJS的duration插件,利用其内置的解析能力:

  1. 先安装并引入插件:
import dayjs from 'dayjs';
import duration from 'dayjs/plugin/duration';

dayjs.extend(duration);
  1. 编写格式化函数:
function formatDurationWithDayJS(isoDuration) {
  const dur = dayjs.duration(isoDuration);
  const resultParts = [];

  if (dur.years()) resultParts.push(`${dur.years()} ${dur.years() === 1 ? 'year' : 'years'}`);
  if (dur.months()) resultParts.push(`${dur.months()} ${dur.months() === 1 ? 'month' : 'months'}`);
  if (dur.days()) resultParts.push(`${dur.days()} ${dur.days() === 1 ? 'day' : 'days'}`);
  if (dur.hours()) resultParts.push(`${dur.hours()} ${dur.hours() === 1 ? 'hour' : 'hours'}`);
  if (dur.minutes()) resultParts.push(`${dur.minutes()} ${dur.minutes() === 1 ? 'minute' : 'minutes'}`);
  if (dur.seconds()) resultParts.push(`${dur.seconds()} ${dur.seconds() === 1 ? 'second' : 'seconds'}`);

  return resultParts.join(', ');
}

// 测试示例
console.log(formatDurationWithDayJS('PT1H')); // 输出:"1 hour"
console.log(formatDurationWithDayJS('PT30M')); // 输出:"30 minutes"
console.log(formatDurationWithDayJS('P14D')); // 输出:"14 days"

两种方法对比

  • 手动解析:无需依赖插件,代码体积小,适合只处理简单、固定格式的Duration场景。
  • DayJS插件:解析逻辑更健壮,能处理带小数、复合单位的复杂Duration,适合需求更灵活的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 15:47:13