以秒为单位将时间间隔格式化为 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 格式

计算时差超过 24 小时

以秒为单位将数字拆分为天、小时、分钟和秒?

从 Avro 将 unix 时间戳(以秒为单位)导入 Bigquery 中的正确时间戳

mysql查询两个日期的时间间隔,以秒为单位