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个回答

4

这里是另一种版本,可以处理天数:

function FormatSecondsAsDurationString( seconds )
{
    var s = "";

    var days = Math.floor( ( seconds / 3600 ) / 24 );
    if ( days >= 1 )
    {
        s += days.toString() + " day" + ( ( days == 1 ) ? "" : "s" ) + " + ";
        seconds -= days * 24 * 3600;
    }

    var hours = Math.floor( seconds / 3600 );
    s += GetPaddedIntString( hours.toString(), 2 ) + ":";
    seconds -= hours * 3600;

    var minutes = Math.floor( seconds / 60 );
    s += GetPaddedIntString( minutes.toString(), 2 ) + ":";
    seconds -= minutes * 60;

    s += GetPaddedIntString( Math.floor( seconds ).toString(), 2 );

    return s;
}

function GetPaddedIntString( n, numDigits )
{
    var nPadded = n;
    for ( ; nPadded.length < numDigits ; )
    {
        nPadded = "0" + nPadded;
    }

    return nPadded;
}

3

我认为在性能方面,这绝对是最快的:

var t = 34236; // your seconds
var time = ('0'+Math.floor(t/3600) % 24).slice(-2)+':'+('0'+Math.floor(t/60)%60).slice(-2)+':'+('0' + t % 60).slice(-2)
//would output: 09:30:36

真的很棒。恭喜! - Brynner Ferreira
不错...并且>24小时安全。 - Jeffz

2

这应该是对某个答案的评论 - Cedric Ipkiss

2

const secondsToTime = (seconds, locale) => {
    const date = new Date(0);
    date.setHours(0, 0, seconds, 0);
    return date.toLocaleTimeString(locale);
}
console.log(secondsToTime(3610, "en"));

其中语言环境参数("en"、"de"等)是可选的。


2

这是我最近为MM:SS写的一篇文章。虽然不完全符合问题,但是采用了不同的单行格式。

const time = 60 * 2 + 35; // 2 minutes, 35 seconds
const str = (~~(time / 60) + "").padStart(2, '0') + ":" + (~~((time / 60) % 1 * 60) + "").padStart(2, '0');

str // 02:35

编辑:这是为了增加多样性而添加的,但最好的解决方案在下面的https://dev59.com/JG015IYBdhLWcg3w7wMW#25279399


2

这里有一个相当简单的解决方案,可以将时间舍入到最接近的秒数!

var returnElapsedTime = function(epoch) {
  //We are assuming that the epoch is in seconds
  var hours = epoch / 3600,
      minutes = (hours % 1) * 60,
      seconds = (minutes % 1) * 60;
  return Math.floor(hours) + ":" + Math.floor(minutes) + ":" + Math.round(seconds);
}


2

正则表达式可以用于匹配从Date对象的toString()方法返回的字符串中的时间子字符串,该字符串格式如下:"Thu Jul 05 2012 02:45:12 GMT+0100 (GMT Daylight Time)"。请注意,此解决方案使用自纪元以来的时间:1970年1月1日午夜。这个解决方案可以是一行代码,但将其分开使其更易于理解。

function secondsToTime(seconds) {
    const start = new Date(1970, 1, 1, 0, 0, 0, 0).getTime();
    const end = new Date(1970, 1, 1, 0, 0, parseInt(seconds), 0).getTime();
    const duration = end - start;

    return new Date(duration).toString().replace(/.*(\d{2}:\d{2}:\d{2}).*/, "$1");
}

时区很讨厌这个。问题是将秒转换为持续时间。 - Ryan Leach

2

以下是我是如何做到的。它似乎运行得相当不错,而且非常紧凑。(尽管使用了很多三元运算符)

function formatTime(seconds) {
  var hh = Math.floor(seconds / 3600),
    mm = Math.floor(seconds / 60) % 60,
    ss = Math.floor(seconds) % 60;
  return (hh ? (hh < 10 ? "0" : "") + hh + ":" : "") + ((mm < 10) && hh ? "0" : "") + mm + ":" + (ss < 10 ? "0" : "") + ss
}

......并用于格式化字符串......

String.prototype.toHHMMSS = function() {
  formatTime(parseInt(this, 10))
};

2
您可以使用以下函数将时间(以秒为单位)转换为HH:MM:SS格式:
var convertTime = function (input, separator) {
    var pad = function(input) {return input < 10 ? "0" + input : input;};
    return [
        pad(Math.floor(input / 3600)),
        pad(Math.floor(input % 3600 / 60)),
        pad(Math.floor(input % 60)),
    ].join(typeof separator !== 'undefined' ?  separator : ':' );
}

不传递分隔符时,默认使用:作为分隔符。
time = convertTime(13551.9941351); // --> OUTPUT = 03:45:51

如果您想使用-作为分隔符,只需将其作为第二个参数传递:

time = convertTime(1126.5135155, '-'); // --> OUTPUT = 00-18-46

演示

var convertTime = function (input, separator) {
    var pad = function(input) {return input < 10 ? "0" + input : input;};
    return [
        pad(Math.floor(input / 3600)),
        pad(Math.floor(input % 3600 / 60)),
        pad(Math.floor(input % 60)),
    ].join(typeof separator !== 'undefined' ?  separator : ':' );
}

document.body.innerHTML = '<pre>' + JSON.stringify({
    5.3515555 : convertTime(5.3515555),
    126.2344452 : convertTime(126.2344452, '-'),
    1156.1535548 : convertTime(1156.1535548, '.'),
    9178.1351559 : convertTime(9178.1351559, ':'),
    13555.3515135 : convertTime(13555.3515135, ',')
}, null, '\t') +  '</pre>';

另请参阅此Fiddle


1

我个人更喜欢没有前导零的领先单位(天,小时,分钟)。但是秒钟应始终由分钟引导(0:13),此表示法很容易被视为“持续时间”,无需进一步说明(标记为min、sec(s)等),可用于各种语言(国际化)。

    // returns  (-)d.h:mm:ss(.f)
    //          (-)h:mm:ss(.f)
    //          (-)m:ss(.f)
    function formatSeconds (value, fracDigits) {
        var isNegative = false;
        if (isNaN(value)) {
            return value;
        } else if (value < 0) {
            isNegative = true;
            value = Math.abs(value);
        }
        var days = Math.floor(value / 86400);
        value %= 86400;
        var hours = Math.floor(value / 3600);
        value %= 3600;
        var minutes = Math.floor(value / 60);
        var seconds = (value % 60).toFixed(fracDigits || 0);
        if (seconds < 10) {
            seconds = '0' + seconds;
        }

        var res = hours ? (hours + ':' + ('0' + minutes).slice(-2) + ':' + seconds) : (minutes + ':' + seconds);
        if (days) {
            res = days + '.' + res;
        }
        return (isNegative ? ('-' + res) : res);
    }

//模仿服务器端(.net, C#)的时间格式,如下:

    public static string Format(this TimeSpan interval)
    {
        string pattern;
        if (interval.Days > 0)          pattern = @"d\.h\:mm\:ss";
        else if (interval.Hours > 0)    pattern = @"h\:mm\:ss";
        else                            pattern = @"m\:ss";
        return string.Format("{0}", interval.ToString(pattern));
    }

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