如何在时刻格式化数字?

时间:2017-02-20 10:36:26

标签: javascript momentjs angular-moment

我使用bs-datepicker将节省时间用作mongodb中的数字。在mongodb中,它具有时间字段,其值为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转换为数字

1 个答案:

答案 0 :(得分:2)

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

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

如果你转换那些你在评论(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

您的价值观根本没有对齐,因为您正在使用时刻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)。