使用moment.js以00:XX格式显示持续时间,当持续时间小于一小时时。

5
我正在尝试使用moment duration格式来格式化倒计时计时器,但是一旦时间低于60分钟,小时就会消失,例如,60分钟显示为“01:00”,这是正确的;而59分钟显示为“59”,这是不正确的,它应该显示为“00:59”。 其中,3500000毫秒等于58分钟。 我有以下代码:
moment.duration(3500000).format("hh:mm", { forceLength: true })

显示的结果是58,而不是00:58。

我在这里做错了什么?

我也尝试了变体,但没有成功。

moment.duration(3500000).format("HH:mm", { forceLength: true })

可能是如何在moment.js持续时间上使用format()?的重复问题。 - user180100
我之前看过那个帖子,那是在duration不支持格式化的旧版本 - 现在它已经支持了,只是没有正确格式化。 - Danish
对我来说,这是一个异常,提示 duration 没有 format 方法。 - Jyothi Babu Araja
@RC。但它给出了UTC,在这种情况下是12:58 - Jyothi Babu Araja
4个回答

11

我可以解释正在发生的事情(我创建了moment-duration-format插件)。

forceLength选项只会影响第一个带有值的令牌,也就是第一个值大于0的令牌。在您的情况下,hh令牌没有值。 https://github.com/jsmreese/moment-duration-format#force-length

hh转换为HH对于格式化 moment 对象(日期)是有意义的,但对于使用我的插件格式化 moment duration 对象(时间长度)则无意义(除非您已经使用我的插件自定义了时长格式化令牌)。

如建议所示,使用 moment(moment.duration(3500000)._data).format("HH:mm"); 是个不错的创造性解决方法。

如果您想获取存储库的dev分支上的moment-duration-format版本,则有一个可以帮助的选项(请参见https://github.com/jsmreese/moment-duration-format/issues/22)...

在该版本中,您可以使用*字符来表示要显示的最小令牌长度,即使它没有值:

moment.duration(3510000).format("*hh:mm");
--> "00:59"
moment.duration(3509999).format("*hh:mm");
--> "00:58"

请注意,dev分支版本的默认行为从truncate更改为round,因此当您从58分钟30秒到达58分钟29秒时,时间会由00:59下降到00:58。在该版本中,您可以为此输出打开 trunc选项:

moment.duration(3539999).format("*hh:mm", { trunc: true });
--> "00:58"
moment.duration(3540000).format("*hh:mm", { trunc: true });
--> "00:59"

不确定这是否是您想要的倒计时解决方案...也许设置余数的“floor”(“trunc”)、“ceiling”或“round”的功能最好?

如果您想要执行ceiling操作,可以使用“dev”分支版本以及“trunc”,并将“60000”添加到计时器值中:

moment.duration(3540000 + 60000).format("*hh:mm", { trunc: true });
--> "01:00"
moment.duration(3539999 + 60000).format("*hh:mm", { trunc: true });
--> "00:59"
moment.duration(3500000 + 60000).format("*hh:mm", { trunc: true });
--> "00:59"
moment.duration(3480000 + 60000).format("*hh:mm", { trunc: true });
--> "00:59"
moment.duration(3479999 + 60000).format("*hh:mm", { trunc: true });
--> "00:58"

谢谢约翰,这是一个金融交易应用程序,因此时间必须准确。答案中提供的解决方案仅适用于持续时间小于60分钟的情况,对于较长的持续时间,它会给出奇怪的时间 - 希望如您所提到的,我们将在未来的发布版本中纳入此功能。 - Danish

7

试试这个

moment(moment.duration(3500000)._data).format("HH:mm");

这个有效了,你是冠军 - 谢谢!- 你能告诉我 ._data 是从哪里来的吗?我在文档中没有看到它。 - Danish
1
@Danish duration 对象包含 _data,其中包含我们需要用于格式化的时间 object - Jyothi Babu Araja
在我看来,forceLength选项与格式应该产生所需的结果,将其他不可用的值渲染为0——或许是内部缺少实现? - Danish
也许我们现在还没有正确的答案。在那之前,请把这个视为一种解决方法。 :) - Jyothi Babu Araja
2
moment.utc(3500000).format("HH:mm"); 的结果不依赖于任何内部机制。无论哪种方式,唯一的问题是它只能在24小时内工作。 - undefined

4

尝试使用“trim”参数。

moment.duration(3500000).format("hh:mm", { trim: false })

这对我的使用情况非常完美,而且没有任何额外的依赖! - LostInQuery

1

我的变量

moment.utc(3400000).format("HH:mm")

给出: "00:56"
希望有用。

嗯... 没有尝试过 - 可能有效。 我实际的实现方式是像这样:moment.duration(moment(this.date).diff(moment())).format("hh:mm")。 到目前为止,我已经通过 Jyothi Babu Araja 提供的解决方案进行了一些变通,如果我检测到持续时间少于60分钟,否则我就应用普通格式。 - Danish

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