【问题标题】:How to format number as time in Moment?如何在 Moment 中将数字格式化为时间?
【发布时间】:2017-02-20 10:36:26
【问题描述】:

我使用bs-datepicker 将时间保存为 mongodb 中的数字。在 mongodb 中,它具有 time 字段,其值为 3870000041400000,分别为 16.1517.00

现在,我想以可读的形式格式化上述时间。我正在使用moment 2.16。在这里我尝试但无法做到jsfiddle

console.log(moment.unix(38700000).format('HH:mm')) //03:30, expect:16:15
console.log(moment.unix(41400000).format('HH:mm')) //09:30, expect:17:00

还有,如何将 HH:mm 转换为数字。例如18:71 转换为数字

【问题讨论】:

  • 当我运行 console.log(moment(38700000).format('HH:mm'));console.log(moment(41400000).format('HH:mm')); 时,我分别得到 10:45 和 11:30 的值。这两个距离您的目标值 5:30 分钟,所以我会确保您的时区是正确的(最好使用 UTC+0)。您可以将 x 作为格式参数传递,以从日期获取 unix 时间戳。
  • 我还想指出,moment.unix(t) 需要一个以秒为单位的 unix 时间戳,而 moment(t) 需要一个以毫秒为单位的 unix 时间戳。
  • @SamJudge,感谢您的回复。我的时区是格林威治标准时间 +5:30,那么如何实现呢?
  • 简单,在 .format() 之前使用 .local() console.log(moment(38700000).local().format('HH:mm')) :) 我看到您正在使用 mongo,所以可能发生的事情是您正在以本地时间格式上传,mongo 商店它是 UTC,当您期待当地时间时,您将获得 UTC 值。执行上述操作应该可以。

标签: javascript momentjs angular-moment


【解决方案1】:

您拥有的数据是自 1970-01-01 00:00:00.000 UTC 以来的毫秒数。

38700000 == 1970-01-01T10:45:00Z
41400000 == 1970-01-01T11:30:00Z

如果您将它们转换到您在 cmets (UTC+05:30) 中提到的时区偏移量,那么值的时间部分将符合您的预期。

38700000 == 1970-01-01T10:45:00Z == 1970-01-01T16:15:00+05:30
41400000 == 1970-01-01T11:30:00Z == 1970-01-01T17:00:00+05:30

您的值根本不对齐,因为您使用的是 moment 的 unix 函数,它预计时间以秒为单位,而不是毫秒(因为 Unix Time 以整秒为单位,除非另有说明)。

此外,通过依赖本地时区,如果用户处于不同的时区,您可能会得到与预期不同的值。

得到你所要求的正确方法是:

moment(38700000).utcOffset("+05:30").format("HH:mm") // "16:15"
moment(41400000).utcOffset("+05:30").format("HH:mm") // "17:00"

请注意,这意味着您的原始数据不是参考 UTC 存储的,而是参考 UTC+05:30 存储的。如果您存储了基于 UTC 的值会更好,所以您会这样做:

moment.utc(58500000).format("HH:mm") // "16:15"
moment.utc(61200000).format("HH:mm") // "17:00"

当然,这里真正的问题是您要将时间存储到日期时间字段中。最好的办法可能是在 MongoDB 数据中根本不使用 Date 类型,而只是将字符串 "16:15" 或等效的总分钟数存储为整数(60 * 16 + 15 == 975 )。

【讨论】:

  • 感谢您的简短示例。最后一段很棒,这是个好方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-19
  • 2022-11-26
  • 2023-04-04
  • 1970-01-01
  • 2021-11-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多