将以秒为单位的时间间隔格式化为X小时Y分钟Z秒。

9

能否将秒数以倒计时的形式进行格式化?例如,如果我有var seconds = 3662,如何显示:1小时1分钟2秒

我尝试使用formatDistanceStrict(3662),但这只打印了小时:1小时

是否有内置的方法也能显示分钟和秒数?我不想写100行代码来实现这个(就像网络上的其他示例一样)。


Moment.js 不是一个选项吗? - Ahmad
https://dev59.com/_mYq5IYBdhLWcg3w0j8T#21840646 - Orelsanpls
很遗憾,@Mody没有。 - Ionel Lupu
4个回答

11
使用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。 - Ionel Lupu
1
这很简单而且优雅。值得一提的是,它不会按周分割(即如果持续时间为1周2天,则转换为“9天”)。 - Yann Pellegrini

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只完成了一半,我以为我从他们的文档中漏掉了什么。真不敢相信这些大型库没有这种功能。 - Ionel Lupu
1
如果使用date-fns的唯一目的是在你的项目中,我认为相比于加载70KB库并在未来保持其与其余环境的兼容性,15行代码(使您可以灵活自定义几乎任何内容)并不会带来太多麻烦。 - Yevhen Horbunkov
当然不是什么头疼的问题。想知道是否有一种真正快速的方法来实现这个功能,而不需要太多的代码行数。我看到他们的存储库中有一个问题与此相关。似乎没有简单的方法来完成这个任务。 - Ionel Lupu
@YevgenGorbunkov 很棒的代码。顺便说一下,date-fns 支持树摇。 - rofrol

0
你在寻找这个吗。
我已经将秒转换为分钟和小时,并返回了字符串。

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分钟”和“1小时”,而不是“01分钟”和“01小时”)。同时,预期输出为“1”,而不是“01”。 - Yevhen Horbunkov

0

就像这样简单:

    const time = new Date(0,0,0)
    time.setSeconds(3662)
    console.log(time.getHours(), 
               time.getMinutes(), 
               time.getSeconds())


1
这对于超过86400秒(1天)的计数不起作用,并且您的结果与预期输出之间存在轻微的格式差异。 - Yevhen Horbunkov
如果 OP 确认需要处理 day+,我可以对其进行一些修改。我认为 OP 愿意做一些工作 :) 只需进行少量更改即可支持任何秒数。 - Ahmad
我和 OP 没有太多的心理联系,无法判断什么是正确的,什么不是。然而,以上代码并没有提供预期的输出,并且在超过一天的时间跨度时无法扩展。 - Yevhen Horbunkov
@YevgenGorbunkov他需要我们的帮助,而不是寻找有人替他完成任务,对吧? - Ahmad
为什么不使用new Date(3662 * 1000)来节省代码呢?或者使用Date(3662 * 1000).toTimeString().split(' ')[0] - RobG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接