以秒为单位将时间间隔格式化为 X 小时(秒) Y 分钟(秒) Z 秒(秒)
Posted
技术标签:
【中文标题】以秒为单位将时间间隔格式化为 X 小时(秒) Y 分钟(秒) Z 秒(秒)【英文标题】:Format time interval in seconds as X hour(s) Y minute(s) Z second(s) 【发布时间】:2020-10-16 19:15:28 【问题描述】:是否可以以倒计时样式格式化秒?比如我有var seconds = 3662
,怎么显示:1 hour 1 minute 2 seconds
。
我尝试使用formatDistanceStrict(3662)
,但这只是打印小时:1 hour
。
是否也有显示分钟和秒的内置方法?我不想写 100 行代码来让它工作(就像来自互联网的其他例子)
【问题讨论】:
不是momentjs的选择吗? ***.com/questions/14157341/… @Mody 很遗憾没有:( 【参考方案1】:使用 date-fns 库我能找到的最简单的解决方案是:
import formatDuration, intervalToDuration from 'date-fns';
function humanDuration(time: number)
return formatDuration(intervalToDuration(start: 0, end: time * 1000));
;
humanDuration(463441); // 5 days 8 hours 44 minutes 1 second
【讨论】:
我正在使用 NG-Zorro UI Kit,它似乎带有 date-fns ^2.10.0 这个简单优雅。值得一提的是,这不会以周为单位(即,如果持续时间是 1 周 2 天,它将转换为“9 天”)【参考方案2】:是这个意思吗?
const seconds = 3662,
formatCounter = s =>
let _s = s
const units = day: 864e2, hour: 3600, minute: 60, second: 1,
str = Object
.entries(units)
.reduce((r, [unit, multiplier]) =>
if(_s >= multiplier)
const count = _s/multiplier|0,
tail = count > 1 ? 's' : ''
r.push([count, unit+tail])
_s = _s%multiplier
return r
, [])
return str.flat().join(' ')
console.log(formatCounter(seconds))
console.log(formatCounter(416920))
【讨论】:
是的。但是我在互联网上找到了很多这样的解决方案。我想通过一个函数调用使用 date-fns 来解决这个问题。 Date-fns 做了一半,我认为我从他们的文档中遗漏了一些东西。不敢相信这些大图书馆没有这个功能 如果这是在您的项目中使用 date-fns 的唯一目的,我真的不认为 15 行代码(让您可以灵活地自定义几乎任何东西)相比起来会让人头疼以加载 70kB 库并在未来保持其与您环境的其余部分的兼容性。 当然不头疼。想知道是否有一种非常快速的方法来获得此功能而无需多行代码。我看到他们的回购有一个关于这个的问题。似乎没有简单的方法可以做到这一点 @YevgenGorbunkov 很棒的代码。 BTW date-fns 支持摇树。【参考方案3】:你在找这个吗?
在这里我将秒转换为分钟和小时
并返回字符串。
function format(time)
// Hours, minutes and seconds
var hrs = ~~(time / 3600);
var mins = ~~((time % 3600) / 60);
var secs = ~~time % 60;
// Output like "1:01" or "4:03:59" or "123:03:59"
var ret = "";
if (hrs > 0)
ret += "" + hrs + " hour " + (mins < 10 ? "0" : "");
ret += "" + mins + " minutes " + (secs < 10 ? "0" : "");
ret += "" + secs + " seconds";
return ret;
console.log(format(3662));
【讨论】:
预期输出明显区分复数和单数(注意'1 minutes'和'1 hour s' 在您的输出中。此外,预期输出是1
,而不是 01
。【参考方案4】:
就这么简单:
const time = new Date(0,0,0)
time.setSeconds(3662)
console.log(time.getHours(),
time.getMinutes(),
time.getSeconds())
【讨论】:
这对于超过 86400(1 天)的秒数不起作用,并且您的结果和预期输出之间的格式略有不同。 如果OP确认需要处理day+,我可以稍微修改一下。我认为 OP 愿意做一些工作 :) 如果可以支持任意秒数,几乎没有什么变化。 我与 OP 并没有太多的心理联系来判断是什么情况,什么情况不是。但是,这并没有改变上述代码没有提供预期的输出并且不会超过 1 天跨度这一事实。 @YevgenGorbunkov 他需要我们的帮助,不是在找人帮他,不是吗? 为什么不new Date(3662 * 1000)
并保存一些代码?或Date(3662 * 1000).toTimeString().split(' ')[0]
.以上是关于以秒为单位将时间间隔格式化为 X 小时(秒) Y 分钟(秒) Z 秒(秒)的主要内容,如果未能解决你的问题,请参考以下文章
输出以秒为单位。在 php 中转换为 hh:mm:ss 格式