【问题标题】:using moment.js to display duration in format 00:XX when duration is less than an hour当持续时间小于一小时时,使用 moment.js 以 00:XX 格式显示持续时间
【发布时间】:2017-05-17 12:41:36
【问题描述】:

我正在尝试使用持续时间格式来格式化倒数计时器 但是一旦时间低于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 })

【问题讨论】:

  • 我之前看到过一个,它是一个较旧的线程,当时持续时间不支持格式化 - 现在它支持,只是它的格式不正确
  • 对我来说,duration 没有方法 format 是个例外
  • @RC。但它给出了UTC,在这种情况下给出了12:58

标签: javascript momentjs


【解决方案1】:

我可以解释发生了什么(我创建了moment-duration-format 插件)。

forceLength 选项仅影响具有值的第一个标记,这意味着值大于0 的第一个标记。在您的情况下,hh 令牌没有值。 https://github.com/jsmreese/moment-duration-format#force-length

hh 切换到HH 意味着用于格式化时刻对象(日期),但不适用于使用我的插件格式化时刻对象(时间长度)(除非您自定义了持续时间格式化标记,即可以使用我的插件)。

按照建议使用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 minutes 30 seconds 传递到58 minutes 29 seconds 时,您将从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)、ceilinground

如果您想要一个上限行为,您可以使用 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"

【讨论】:

  • 感谢 john,它是一个金融交易应用程序,所以时间必须准确,此处提供的解决方案仅在持续时间小于 60 分钟时有效,在较长的持续时间内它会给出奇怪的时间 - 希望正如您所提到的,我们将在未来的版本中加入此功能
【解决方案2】:

试试这个

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

【讨论】:

  • 这成功了,你的冠军 - 谢谢! - 你能告诉我 ._data 来自哪里吗?我在任何地方的文档中都没有看到它
  • @Danish duration 对象有_data,其中包含我们需要格式化的时间object
  • 在我看来,带有格式的 forceLength 选项应该产生了预期的结果,将其他不可用的值呈现为 0 - 可能在内部缺少实现?
  • 也许我们可能有正确的答案。在此之前,请将此视为一种解决方法。 :)
  • moment.utc(3500000).format("HH:mm"); 在不依赖任何内部结构的情况下给出相同的结果。无论哪种方式,唯一的问题是它最多只能工作 24 小时。
【解决方案3】:

试试 'trim' 参数。

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

【讨论】:

  • 这非常适合我的用例,没有任何额外的依赖!
【解决方案4】:

我的变种

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

给出:“00:56”

希望会有用。

【讨论】:

  • hmm.. 没有尝试过 - 可能会像我所拥有的实际实现一样 moment.duration(moment(this.date).diff(moment())).format("hh: mm") 到目前为止,我已经解决了 Jyothi Babu Araja 提供的解决方案,如果我检测到持续时间小于 60 分钟,否则我只应用正常格式
猜你喜欢
  • 1970-01-01
  • 2020-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多