使用moment.js如何为一个持续时间指定特定的格式

3

假设我们从API中获取到一个持续时间,以秒为单位,如duration_seconds = 86485

(1天, 0小时, 1分钟, 1秒)

我打算使用moment.js将其转换为格式化的持续时间,具体方法如下:

 1. {d} {hh}:{mm}:{ss} (1d 00:01:01)
 2. {d}d {hh}h m{mm} s{ss} (1d 04h 30m 23s)

我还想确保以下内容:

  • 如果天数是0,天数会被删除(00:01:01 - 表示1分钟1秒)
  • hh:mm:ss从不被删除,1秒钟显示为00:00:01

我可以这样创建时间间隔:

moment.duration(duration_seconds, 'seconds')

人性化函数不太适合,因为它只是近似值。我也可以自己编写:
duration.get('d')
duration.get('h')
duration.get('m')
duration.get('s')

我似乎找不到一个内置的函数,但我认为这应该是一个显而易见的功能?如果我遗漏了什么,请告诉我,否则我可以向Moment库提交PR。

这似乎意味着该函数仍不存在: 使用moment.js,如何将持续时间简化到最简形式?


https://momentjs.com/docs/#/parsing/string-format/ - Erazihel
3
有MomentJS的插件。其中一个似乎是你所需要的:http://momentjs.com/docs/#/plugins/duration-format/ - Heretic Monkey
https://github.com/jsmreese/moment-duration-format谢谢 @MikeMcCaughan。我也看到这个问题在GitHub的问题中经常被提及。 - Steve
@MikeMcCaughan 那个插件仍然没有完全解决问题。如果您有一秒钟,使用格式('hh:mm:ss'),它仍然显示持续时间为“01”,而不是“00:00:01”。 - Steve
@MikeMcCaughan - 请注意,此功能已经存在于插件中。我已在下面的答案中添加了相关内容。 - Matt Johnson-Pint
显示剩余4条评论
2个回答

4

使用moment-duration-format 插件,可以帮助您完成此操作。

// your input
var duration_seconds = 86485;

// create a moment-duration object
var duration = moment.duration(duration_seconds, 'seconds');

// format the object with a string
var formatted = duration.format('h[h] m[m] s[s]');

// displaying the output here
document.getElementById('output').innerHTML = formatted;
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-duration-format/1.3.0/moment-duration-format.min.js"></script>
<div id="output" />

请注意,默认情况下它会省略那些不相关的单位,所以如果您的输入是3,它只会显示"3s",而不是"0h 0m 3s"
如果您想改变这种行为,请设置trim:false,见文档。例如,要获取您在评论中提到的格式,请使用:
.format('hh:mm:ss', { trim: false })

0

或许你可以尝试这个?

moment(duration).format("DD MMM YYYY hh:mm: a")

不过你可能需要将秒转换为毫秒。可以通过 duration * 1000 来实现。

从这个答案中找到的:Moment js convert milliseconds into date and time


1
formation 不是一个函数,我想你的意思是 format。但如果你要这样做,你需要使用 moment.utc(duration)(或者如果你不想 * 1000 的话,可以使用 moment.unix(duration))。 - Matt Johnson-Pint
2
如果您需要表示超过31天的时间,也会遇到问题。最终,格式化日期/时间与格式化持续时间是不同的。 - Matt Johnson-Pint
@MattJohnson 啊,感谢你的拼写检查!有趣的是,我现在不是 moment.js 的专家,所以我会把这个问题留给那些更有能力回答的人。 - Tino Caer
这个答案不太适合。我需要处理时间段而不是时间点。 - Steve

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接