如何使用 moment.js 从 unix 时间戳中获取剩余的小时、分钟和秒?
How to use moment.js to get remaining hours, minutes, and seconds from a unix timestamp?
如果将来有一个 unix 时间戳,我如何使用 Moment.js 获取到那时剩余的小时、分钟和秒数?
例如:
now = 1589252712837
time = 1589356202907
// This is the line I do not know
res = moment(time - now)
console.log(res)
// 23 hours, 12 minutes, 3 seconds
编辑:
我相信我可以做这样的事情,但是有本地方法吗?:
now = 1589252712837
time = 1589356202907
remaining = time - now
hour = moment(remaining).hour()
minute = moment(remaining).minute()
second = moment(remaining).second()
console.log(`${hour} hours, `${minute} minutes, ${seconds} seconds`)
// 23 hours, 12 minutes, 3 seconds
请注意,您的示例代码是时间偏移:remaining/1000/60/60
~=28,而不是 23。您需要使用 moment.utc
。不过我不建议这样做,因为你会遇到其他问题,比如处理天数和月数。
至于 "native" 支持,请参阅此处的长篇讨论:https://github.com/moment/moment/issues/463
TL;DR:从 2012 年讨论到现在。而且,在文档中,他们指向 moment-duration-format 插件。
如果你想要接近 "native" 支持的东西,请查看此插件:
https://github.com/jsmreese/moment-duration-format
老实说,看情况,如果是我,我可能直接用moment-duration-format,或者直接用humanize()
。也许我自己的滚动类似于 duration._data 的生成方式 + Intl.NumberFormat,这就是我猜 moment-duration-format 基本上已经在做的事情。
我将列出一些我能看到的可能的方法:
now = 1589252712837
time = 1589356202907
remaining = time - now
// extract key(units),value from parsed ._data property of duration
// no additional dependencies but depends on internal private variable _data
console.log(
Object.entries(moment.duration(remaining,'milliseconds')._data).reverse()
.flatMap(([unit,value])=>value!==0?`${value} ${unit}`:[]).join(' ')
);
// using moment-duration-format plugin
console.log(moment.duration(remaining,'milliseconds').format('h [hours] m [minutes] s [seconds]'))
// twitter style humanize
console.log(moment.duration(remaining,'milliseconds').humanize());
// hours threshhold is Infinity; never round up to higher units than hours
console.log(moment.duration(remaining,'milliseconds').humanize({h:Infinity}));
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.25.3/moment.min.js"></script>
<!-- moment-duration-format plugin -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-duration-format/2.3.1/moment-duration-format.min.js"></script>
如果将来有一个 unix 时间戳,我如何使用 Moment.js 获取到那时剩余的小时、分钟和秒数?
例如:
now = 1589252712837
time = 1589356202907
// This is the line I do not know
res = moment(time - now)
console.log(res)
// 23 hours, 12 minutes, 3 seconds
编辑:
我相信我可以做这样的事情,但是有本地方法吗?:
now = 1589252712837
time = 1589356202907
remaining = time - now
hour = moment(remaining).hour()
minute = moment(remaining).minute()
second = moment(remaining).second()
console.log(`${hour} hours, `${minute} minutes, ${seconds} seconds`)
// 23 hours, 12 minutes, 3 seconds
请注意,您的示例代码是时间偏移:remaining/1000/60/60
~=28,而不是 23。您需要使用 moment.utc
。不过我不建议这样做,因为你会遇到其他问题,比如处理天数和月数。
至于 "native" 支持,请参阅此处的长篇讨论:https://github.com/moment/moment/issues/463
TL;DR:从 2012 年讨论到现在。而且,在文档中,他们指向 moment-duration-format 插件。
如果你想要接近 "native" 支持的东西,请查看此插件:
https://github.com/jsmreese/moment-duration-format
老实说,看情况,如果是我,我可能直接用moment-duration-format,或者直接用humanize()
。也许我自己的滚动类似于 duration._data 的生成方式 + Intl.NumberFormat,这就是我猜 moment-duration-format 基本上已经在做的事情。
我将列出一些我能看到的可能的方法:
now = 1589252712837
time = 1589356202907
remaining = time - now
// extract key(units),value from parsed ._data property of duration
// no additional dependencies but depends on internal private variable _data
console.log(
Object.entries(moment.duration(remaining,'milliseconds')._data).reverse()
.flatMap(([unit,value])=>value!==0?`${value} ${unit}`:[]).join(' ')
);
// using moment-duration-format plugin
console.log(moment.duration(remaining,'milliseconds').format('h [hours] m [minutes] s [seconds]'))
// twitter style humanize
console.log(moment.duration(remaining,'milliseconds').humanize());
// hours threshhold is Infinity; never round up to higher units than hours
console.log(moment.duration(remaining,'milliseconds').humanize({h:Infinity}));
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.25.3/moment.min.js"></script>
<!-- moment-duration-format plugin -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-duration-format/2.3.1/moment-duration-format.min.js"></script>