如何用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插件,利用其内置的解析能力:
- 先安装并引入插件:
import dayjs from 'dayjs'; import duration from 'dayjs/plugin/duration'; dayjs.extend(duration);
- 编写格式化函数:
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
相关产品推荐
相关产品推荐

