Строка в секундах в JavaScript с форматом чч: мм: сс - PullRequest
263 голосов
/ 11 июня 2011

Я хочу преобразовать время, то есть количество секунд, в строку времени, разделенную двоеточиями (чч: мм: сс)

Я нашел здесь несколько полезных ответов, но все они говорят о преобразовании в формат х часов и х минут.

Так есть ли небольшой фрагмент кода, который делает это в jQuery, или просто сырой JavaScript?

Ответы [ 39 ]

10 голосов
/ 08 августа 2013

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

результат 15:08:03

9 голосов
/ 14 апреля 2015

Это довольно легко,

function toTimeString(seconds) {
  return (new Date(seconds * 1000)).toUTCString().match(/(\d\d:\d\d:\d\d)/)[0];
}
8 голосов
/ 10 октября 2013
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
6 голосов
/ 14 февраля 2015

Мне больше всего понравился ответ Webjins, поэтому я расширил его, чтобы отображать дни с суффиксом рекламы, сделал отображение условным и включил суффикс в простые секунды:

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" или "12сек"

6 голосов
/ 29 октября 2014

Мне понравился ответ 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

4 голосов
/ 10 апреля 2014
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"
4 голосов
/ 03 декабря 2013

Я думаю, что по производительности это самый быстрый:

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
3 голосов
/ 01 апреля 2013

Вот еще одна версия, которая также обрабатывает дни:

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 голосов
/ 05 июля 2012

Регулярное выражение может использоваться для сопоставления временной подстроки в строке, возвращаемой методом toString() объекта Date, который отформатирован следующим образом: «Чт, 05 июля 2012 02:45:12 GMT + 0100 (GMT Дневное время). Обратите внимание, что в этом решении используется время, прошедшее с эпохи: полночь 1 января 1970 года. Это решение может быть однострочным, хотя его разбиение упрощает понимание.

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");
}
2 голосов
/ 21 января 2014

Вот как я это сделал.Кажется, это работает довольно хорошо, и это очень компактно.(Хотя используется много троичных операторов)

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))
};
...