Skip to content

MomentJS - 持续时间

现代日期/时间:Moment.js 中的持续时间

Section titled “现代日期/时间:Moment.js 中的持续时间”

处理一段时间长度,或称“持续时间”(durations),是应用程序中的常见任务,例如计算订阅周期或任务完成时间。Moment.js 提供了一个专门的 duration 对象来有效管理这些时间跨度。

虽然 Moment.js 简化了持续时间处理,但请记住它目前处于维护模式。对于新项目,请考虑 Day.js 或 date-fns 等替代方案,它们通常提供更好的性能和更小的打包体积(bundle sizes)。更多详细信息请参阅“概述”部分。

您可以通过几种方式创建持续时间对象:

  • 从数字和单位创建:moment.duration(100, 'milliseconds'), moment.duration(2, 'hours')
  • 从对象创建:moment.duration({ seconds: 2, minutes: 2, hours: 2, days: 2, weeks: 2, months: 2, years: 2 })
  • 从 ISO 8601 持续时间字符串创建:moment.duration('P1Y2M3DT4H5M6S')
  • 从两个时刻之间的差值创建:const duration = moment.duration(endMoment.diff(startMoment));

一旦您拥有一个持续时间对象,就可以使用各种方法对其进行操作和查询:

方法类别示例语法
创建moment.duration(Number, String);
moment.duration(Object);
moment.duration(String);
克隆(对不可变性很重要)const newDuration = originalDuration.clone();
人性化显示(易读格式)duration.humanize(); // 例如,‘a few seconds’, ‘2 hours’
获取总长度(以特定单位)duration.asMilliseconds();
duration.asSeconds();
duration.asMinutes();
duration.asHours();
duration.asDays();
duration.asWeeks();
duration.asMonths();
duration.asYears();
获取单位值(在持续时间分解中)duration.milliseconds(); // 0-999
duration.seconds(); // 0-59
duration.minutes(); // 0-59
duration.hours(); // 0-23
duration.days(); // 0-30 (approx)
duration.weeks(); // (derived)
duration.months(); // 0-11
duration.years();
增加时间duration.add(500, ‘ms’);
duration.add({ hours: 1, minutes: 30 });
duration.add(anotherDuration);
减少时间duration.subtract(1, ‘day’);
duration.subtract({ seconds: 10 });
duration.subtract(anotherDuration);
获取特定单位值(单位值获取器的别名)duration.get(‘hours’); // 等同于 duration.hours()
转换为 ISO 8601 字符串duration.toISOString(); // 例如,‘PT1H30M’
转换为 JSON(序列化)duration.toJSON(); // 返回 ISO 8601 字符串
检查类型moment.isDuration(obj); // 如果 obj 是 Moment Duration 对象则返回 true
本地化duration.locale(String); // 为 humanize 输出设置语言环境
duration.locale(); // 获取当前语言环境
const startTime = moment('2023-10-26T09:00:00');
const endTime = moment('2023-10-26T11:25:30');
// Calculate the difference
const taskDuration = moment.duration(endTime.diff(startTime));
// Display in a human-readable format
console.log(`Task took approximately ${taskDuration.humanize()}.`); // Output: Task took approximately 2 hours.
// Get the precise duration in minutes
console.log(`Precise duration: ${taskDuration.asMinutes()} minutes.`); // Output: Precise duration: 145.5 minutes.
// Get component values
console.log(`Hours: ${taskDuration.hours()}, Minutes: ${taskDuration.minutes()}, Seconds: ${taskDuration.seconds()}`); // Output: Hours: 2, Minutes: 25, Seconds: 30

这演示了持续时间如何表示时间差,并可以以各种格式显示或分析。

对于更复杂的持续时间格式化(例如,‘HH:mm:ss’),您可能需要使用 moment-duration-format 插件(请检查其维护状态)或使用自定义格式化逻辑。

请参考 Moment.js 官方文档了解详细的 API 信息:https://momentjs.com/docs/#/durations/