JavaScript将秒转换为格式为hh:mm:ss的时间字符串

415

我想将时间长度(即秒数)转换为冒号分隔的时间字符串(hh:mm:ss)。

我在这里找到了一些有用的答案,但它们都是关于转换为x小时和x分钟格式的。

那么有没有一个小片段可以在jQuery或纯JavaScript中实现此操作?


15
此线程提供的一些答案的基准测试结果。 http://jsperf.com/ms-to-hh-mm-ss-time-format - Claudijo
可能是将秒转换为HH-MM-SS的JavaScript?的重复问题。 - KyleMit
47个回答

14

这很容易。

function toTimeString(seconds) {
  return (new Date(seconds * 1000)).toUTCString().match(/(\d\d:\d\d:\d\d)/)[0];
}

这仅适用于时间持续少于1天的情况。但除此之外,非常好。 - cjbarth

12
这是使用 Date.prototype.toLocaleTimeString() 的示例。我选择了GB作为语言,因为美国显示初始小时的24而不是00。此外,我选择Etc/UTC作为时区,因为tz数据库时区列表中将UTC别名为它。

const formatTime = (seconds) =>
  new Date(seconds * 1000).toLocaleTimeString('en-GB', {
    timeZone:'Etc/UTC',
    hour12: false,
    hour: '2-digit',
    minute: '2-digit',
    second: '2-digit'
  });

console.log(formatTime(75)); // 00:01:15
.as-console-wrapper { top: 0; max-height: 100% !important; }

这是相同的例子,但使用 Intl.DateTimeFormat。这种变体允许您实例化可重复使用的格式化程序对象,性能更好。

const dateFormatter = new Intl.DateTimeFormat('en-GB', {
  timeZone:'Etc/UTC',
  hour12: false,
  hour: '2-digit',
  minute: '2-digit',
  second: '2-digit'
});

const formatTime = (seconds) => dateFormatter.format(new Date(seconds * 1000));

console.log(formatTime(75)); // 00:01:15
.as-console-wrapper { top: 0; max-height: 100% !important; }


如果时间大于24小时(86400秒),则会产生错误的结果。 - Tim
这非常聪明。谢谢! - akirk

11

new Date().toString().split(" ")[4];

结果为 15:08:03


很好 - 謝謝!我為了自己的需求做了一個小改進,將毫秒數轉換為HH:MM:SS -- new Date(new Date().getTime() - startTime).toUTCString().split(" ")[4],其中startTime是之前設置的,使用startTime = new Date().getTime();。(我必須使用toUTCString(),否則時間會相差一個小時。) - IpsRich

11

最简单的方法来完成它。

new Date(sec * 1000).toISOString().substr(11, 8)

4
请注意,这里使用的是模24小时制,如果您输入相当于25小时的时间,它会显示为1小时。请小心。 - maxime1992

8
s2t=function (t){
  return parseInt(t/86400)+'d '+(new Date(t%86400*1000)).toUTCString().replace(/.*(\d{2}):(\d{2}):(\d{2}).*/, "$1h $2m $3s");
}

s2t(123456);

结果:

1d 10h 17m 36s

7
我最喜欢Webjins的答案,所以我进行了扩展,以显示带有d后缀的天数,条件显示并在普通秒数上包含s后缀:
function sec2str(t){
    var d = Math.floor(t/86400),
        h = ('0'+Math.floor(t/3600) % 24).slice(-2),
        m = ('0'+Math.floor(t/60)%60).slice(-2),
        s = ('0' + t % 60).slice(-2);
    return (d>0?d+'d ':'')+(h>0?h+':':'')+(m>0?m+':':'')+(t>60?s:s+'s');
}

返回"3d 16:32:12"或"16:32:12"或"32:12"或"12s"


这将在持续时间为24天或更长时间时不正确。 - Charlie Martin
为什么要比较字符串大于0? - Jimmy Kane
@JimmyKane 因为自动类型转换 - 我太喜欢它了!(另外:代码更易于阅读(你有类型转换的原因,但让我们停止互相嘲笑)。另外:如果 t 是 NaN,函数只会失败 - 所以如果您想要安全性:请在输入时进行检查!) - nïkö
@nïkö 好的,我明白了,但是新版本的JS、代码检查工具等可能会对此提出更严格的要求和抱怨。只是说一下,不要误解我的意思。我喜欢你的回答。 - Jimmy Kane

7

我喜欢Powtac的回答,但我想在angular.js中使用它,所以我使用他的代码创建了一个过滤器。

.filter('HHMMSS', ['$filter', function ($filter) {
    return function (input, decimals) {
        var sec_num = parseInt(input, 10),
            decimal = parseFloat(input) - sec_num,
            hours   = Math.floor(sec_num / 3600),
            minutes = Math.floor((sec_num - (hours * 3600)) / 60),
            seconds = sec_num - (hours * 3600) - (minutes * 60);

        if (hours   < 10) {hours   = "0"+hours;}
        if (minutes < 10) {minutes = "0"+minutes;}
        if (seconds < 10) {seconds = "0"+seconds;}
        var time    = hours+':'+minutes+':'+seconds;
        if (decimals > 0) {
            time += '.' + $filter('number')(decimal, decimals).substr(2);
        }
        return time;
    };
}])

这个功能与之前的版本相同,唯一的不同就是我增加了一个可选的小数点字段来显示小数秒。像使用其他过滤器一样使用它:

{{ elapsedTime | HHMMSS }} 显示为: 01:23:45

{{ elapsedTime | HHMMSS : 3 }} 显示为: 01:23:45.678


我有两个日期时间对象,我想计算这两个日期时间对象之间的差异,并返回格式为:小时:分钟:秒,如:01:02:45。你能否告诉我或用你的代码指导我一下? - Learning-Overthinker-Confused

4
function secToTime(seconds, separator) {
    return [
        parseInt(seconds / 60 / 60),
        parseInt(seconds / 60 % 60),
        parseInt(seconds % 60)
    ].join(separator ? separator : ':')
    .replace(/\b(\d)\b/g, "0$1").replace(/^00\:/,'')
}

您现在可以像这样使用:

alert(secToTime("123"));

可运行代码片段:

function secToTime(seconds, separator) {
return [
    parseInt(seconds / 60 / 60),
    parseInt(seconds / 60 % 60),
    parseInt(seconds % 60)
].join(separator ? separator : ':')
.replace(/\b(\d)\b/g, "0$1").replace(/^00\:/,'')
}

console.log(secToTime("123"));


4
这个问题的最普遍回答是:
function hms(seconds) {
  return [3600, 60]
    .reduceRight(
      (p, b) => r => [Math.floor(r / b)].concat(p(r % b)),
      r => [r]
    )(seconds)
    .map(a => a.toString().padStart(2, '0'))
    .join(':');
}

一些示例输出:
> hms(0)
< "00:00:00"

> hms(5)
< "00:00:05"

> hms(60)
< "00:01:00"

> hms(3785)
< "01:03:05"

> hms(37850)
< "10:30:50"

> hms(378500)
< "105:08:20"

请参考https://dev59.com/jHM_5IYBdhLWcg3wlEBH#66504936中的解释。


4
function toHHMMSS(seconds) {
    var h, m, s, result='';
    // HOURs
    h = Math.floor(seconds/3600);
    seconds -= h*3600;
    if(h){
        result = h<10 ? '0'+h+':' : h+':';
    }
    // MINUTEs
    m = Math.floor(seconds/60);
    seconds -= m*60;
    result += m<10 ? '0'+m+':' : m+':';
    // SECONDs
    s=seconds%60;
    result += s<10 ? '0'+s : s;
    return result;
}

示例

    toHHMMSS(111); 
    返回 "01:51"
toHHMMSS(4444); 返回 "01:14:04"
toHHMMSS(33); 返回 "00:33"

我会在秒数上也加上 Math.floor(),因为它们可能是小数。 (这种情况曾经发生过。) - Winter

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