Конвертировать секунды в HH-MM-SS с JavaScript?


Ответы:


110

Вы не знаете свиданий ? это надо знать.

Используя datejs, просто напишите что-то вроде:

(new Date).clearTime()
          .addSeconds(15457)
          .toString('H:mm:ss');

--Обновить

В настоящее время date.js устарел и не поддерживается, поэтому используйте « Moment.js », что гораздо лучше, как указал TJ Crowder.

- обновление 2

Пожалуйста, используйте @ Frank's решение в одну строку:

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

На сегодняшний день это лучшее решение.


11
@Yassir и Cleiton: FWIW, DateJS не поддерживалась годами, и в ней есть пара выдающихся ошибок (хотя, насколько мне известно, они в основном касаются разбора и полуночи). Момент кажется довольно хорошим, и в настоящее время поддерживается.
TJ Crowder

1
@Cleiton, ваш обновленный ответ не полный. Я попробовал это , как это и получилось: TypeError: Object [object Date] has no method 'clearTime'.
Хэмиш Грубиджан

19
Предоставленный Moment.js не так уж и велик, но если все, что вы делаете с ним, - это конвертирование секунд в чч: мм: сс, то это выглядит немного излишним. Скорее используйте одну из функций, предложенных в тех или иных ответах.
Ола Карлссон,

5
Я думаю, что другое решение лучше, чем добавление другой библиотеки js в микс.
Донато

4
Добавление библиотеки для одного простого действия, я думаю, не следует принимать ответ. Да, это работает, но есть лучшие решения !!!
Андрис

405

Вы можете сделать это без какой-либо внешней библиотеки JavaScript с помощью метода JavaScript Date, как показано ниже:

var date = new Date(null);
date.setSeconds(SECONDS); // specify value for SECONDS here
var result = date.toISOString().substr(11, 8);

Или, согласно комментарию @Frank ; один лайнер:

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

39
Я не знаю, почему все добавляют дополнительные библиотеки или делают математику вручную, когда это работает отлично. Спасибо!
Jminardi

98
Это можно даже сократить до одной строки: new Date(SECONDS * 1000).toISOString().substr(11, 8);
Фрэнк

4
Brilliant. Без какой-либо третьей стороны lib. Это лучше всего
Риз

41
Проблема с этим подходом заключается в том, что он будет переполнен через 24 часа, что не позволит вам показать больше, чем этот промежуток времени. Идеальное решение, если у вас есть менее 24 часов в секундах.
Ренато Гама

1
Это не работает для меня в IE11, я получаюObject doesn't support property or method 'toISOString'
NibblyPig

153

Я не думаю, что какая-либо встроенная функция стандартного объекта Date сделает это для вас более удобным способом, чем простая математика.

hours = Math.floor(totalSeconds / 3600);
totalSeconds %= 3600;
minutes = Math.floor(totalSeconds / 60);
seconds = totalSeconds % 60;

Пример:


Есть некоторые проблемы с этим, я думаю? Когда я пытался это сделать, я получал десятичные дроби, поэтому 0.05в hoursпеременной вернулось бы 180 секунд . Я положил его внутрь, чтобы parseIntисправить это для моего случая, но я не думаю, что это будет точно для всего. Тем не менее, это помогло мне, так что спасибо!
BT643

@ BT643: Странно, что я не справился с этим. Я сделал это сейчас, вы не хотите использовать parseIntего для анализа строк , а не манипулирования числами. Math.floorбудет соответствующей операцией здесь.
TJ Crowder

1
Ах хорошо! Изменил мой код Хотя вы, вероятно, хотите это и на секундах seconds = Math.floor(totalSeconds % 60);. Я тоже получил там десятичный результат.
BT643

@ BT643: totalSeconds % 60может иметь только дробную часть, если totalSecondsимеет дробную часть. Если вы хотите выступить, это будет зависеть от того, хотите ли вы потерять эту информацию или сохранить ее. (Другие операции на полу, которые мы делаем, не теряют никакой информации, потому что они просто очищают данные, которые в конечном итоге minutesи seconds.)
TJ Crowder

8
@HannounYassirconsole.log( hours +':'+ ('0'+minutes).slice(-2) +':'+ ('0'+seconds).slice(-2) );
Хави Эстев

60

Я знаю, что это довольно старое, но ...

ES2015:

var toHHMMSS = (secs) => {
    var sec_num = parseInt(secs, 10)
    var hours   = Math.floor(sec_num / 3600)
    var minutes = Math.floor(sec_num / 60) % 60
    var seconds = sec_num % 60

    return [hours,minutes,seconds]
        .map(v => v < 10 ? "0" + v : v)
        .filter((v,i) => v !== "00" || i > 0)
        .join(":")
}

Это выведет:

toHHMMSS(129600) // 36:00:00
toHHMMSS(13545) // 03:45:45
toHHMMSS(180) // 03:00
toHHMMSS(18) // 00:18

2
Как насчет доли секунды? 03: 45: 45.xxx?
Майк Стоддарт,

1
@ SantiagoHernández Отлично! Теперь это работает отлично в течение 24 часов.
Стефнотч

2
+1. Это или TJ должен быть принятым ответом, поскольку они единственные, которые работают в ситуациях, когда продолжительность превышает 24 часа (и вопрос не ограничивает продолжительность).
Джордж Ю.

38

Как указал Клитон в своем ответе , для этого можно использовать moment.js :

moment().startOf('day')
        .seconds(15457)
        .format('H:mm:ss');

5
Что произойдет, если количество секунд превышает день?
Гилад Пелег,

3
@GiladPeleg, если количество секунд превышает день, количество дней рассчитывается внутри и возвращает только оставшиеся часы, минуты и секунды. Если вы хотите посчитать количество дней, вы можете попробовать moment().startOf('year').seconds(30000000).format('DDD HH:mm:ss').
Elquimista

9
Что произойдет, если количество секунд превышает год?
OrangePot

3
@OrangePot, если количество секунд превышает год, число лет рассчитывается внутренне и возвращает только оставшиеся дни, часы, минуты и секунды. Если вы хотите посчитать количество лет, вы можете попробовать.format('YYYY DDD HH:mm:ss')
Дэвид

1
Но это нельзя сделать необязательным. Это может выглядеть уродливо.
Шедрич

22
function formatSeconds(seconds)
{
    var date = new Date(1970,0,1);
    date.setSeconds(seconds);
    return date.toTimeString().replace(/.*(\d{2}:\d{2}:\d{2}).*/, "$1");
}

2
formatSeconds (3919); // Возвращает 01:05:19 Отличная функция .. Мне нравится
Самрат Саха

17

Это делает трюк:

function secondstotime(secs)
{
    var t = new Date(1970,0,1);
    t.setSeconds(secs);
    var s = t.toTimeString().substr(0,8);
    if(secs > 86399)
        s = Math.floor((t - Date.parse("1/1/70")) / 3600000) + s.substr(2);
    return s;
}

(Источник отсюда )


12
var  timeInSec = "661"; //even it can be string

String.prototype.toHHMMSS = function () { 
   /* extend the String by using prototypical inheritance */
    var seconds = parseInt(this, 10); // don't forget the second param
    var hours   = Math.floor(seconds / 3600);
    var minutes = Math.floor((seconds - (hours * 3600)) / 60);
    seconds = seconds - (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;
    return time;
}

alert("5678".toHHMMSS());   // "01:34:38"
console.log(timeInSec.toHHMMSS());   //"00:11:01"

мы можем сделать эту функцию намного короче и четче, но это уменьшает удобочитаемость, поэтому мы напишем ее как можно более простой и стабильной.

или вы можете проверить это, работая здесь :


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

Спасибо! нет необходимости включать библиотеку в расширение браузера. Просто и работает!
Арло

9

Попробуй это:

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

7

Вот расширение класса Number. toHHMMSS () преобразует секунды в строку чч: мм: сс.

Number.prototype.toHHMMSS = function() {
  var hours = Math.floor(this / 3600) < 10 ? ("00" + Math.floor(this / 3600)).slice(-2) : Math.floor(this / 3600);
  var minutes = ("00" + Math.floor((this % 3600) / 60)).slice(-2);
  var seconds = ("00" + (this % 3600) % 60).slice(-2);
  return hours + ":" + minutes + ":" + seconds;
}

// Usage: [number variable].toHHMMSS();

// Here is a simple test
var totalseconds = 1234;
document.getElementById("timespan").innerHTML = totalseconds.toHHMMSS();
// HTML of the test
<div id="timespan"></div>


5

Легко следовать версии для новичков:

 var totalNumberOfSeconds = YOURNUMBEROFSECONDS;
 var hours = parseInt( totalNumberOfSeconds / 3600 );
 var minutes = parseInt( (totalNumberOfSeconds - (hours * 3600)) / 60 );
 var seconds = Math.floor((totalNumberOfSeconds - ((hours * 3600) + (minutes * 60))));
 var result = (hours < 10 ? "0" + hours : hours) + ":" + (minutes < 10 ? "0" + minutes : minutes) + ":" + (seconds  < 10 ? "0" + seconds : seconds);
 console.log(result);

5

Эта функция должна сделать это:

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

Смотрите также эту скрипку .


Может использовать параметры по умолчанию, такие как (input, separator = ":"). Кроме того, ничего не возвращалось, пока я немного не изменил paste.ee/p/FDNag
madprops

@madprops: На самом деле, версия в моем ответе уже установлена :по умолчанию для separatorпараметра, как я уже объяснил. Это сделано заявлением typeof separator !== 'undefined' ? separator : ':'. Кроме того, ваша функция в значительной степени идентична моей, за исключением некоторых косметических изменений, и они оба должны давать одинаковый результат ... за исключением того, что моя версия имеет гораздо лучшую поддержку браузера. Ваша не будет работать в ЛЮБОЙ версии Internet Explorer или MS Edge <14.
Джон

5

ниже приведен код, который преобразует секунды в формат чч-мм-сс:

var measuredTime = new Date(null);
measuredTime.setSeconds(4995); // specify value of SECONDS
var MHSTime = measuredTime.toISOString().substr(11, 8);

Получить альтернативный метод из Конвертировать секунды в формат HH-MM-SS в JavaScript


Вы скопировали пасту из этого ответа ?
StefansArya

5

Для особого случая HH: MM: SS.MS (например, «00: 04: 33.637»), используемого FFMPEG для указания миллисекунд .

[-] [HH:] MM: SS [.m ...]

HH выражает количество часов, MM - количество минут максимум для 2 цифр, а SS - количество секунд максимум для 2 цифр. М в конце выражает десятичное значение для СС.

/* HH:MM:SS.MS to (FLOAT)seconds ---------------*/
function timerToSec(timer){
   let vtimer = timer.split(":")
   let vhours = +vtimer[0]
   let vminutes = +vtimer[1]
   let vseconds = parseFloat(vtimer[2])
   return vhours * 3600 + vminutes * 60 + vseconds
}

/* Seconds to (STRING)HH:MM:SS.MS --------------*/
function secToTimer(sec){
  let o = new Date(0)
  let p =  new Date(sec*1000)  
  return new Date(p.getTime()-o.getTime())
    .toISOString()
    .split("T")[1]
    .split("Z")[0]
}

/* Example: 7hours, 4 minutes, 33 seconds and 637 milliseconds */
const t = "07:04:33.637"
console.log(
  t + " => " +
  timerToSec(t) +
  "s"
)

/* Test: 25473 seconds and 637 milliseconds */
const s = 25473.637 // "25473.637"
console.log(
  s + "s => " + 
  secToTimer(s)
)

Пример использования, транспортный таймер в миллисекундах:

/* Seconds to (STRING)HH:MM:SS.MS --------------*/
function secToTimer(sec){
  let o = new Date(0)
  let p =  new Date(sec*1000)  
  return new Date(p.getTime()-o.getTime())
    .toISOString()
    .split("T")[1]
    .split("Z")[0]
}

let job, origin = new Date().getTime()
const timer = () => {
  job = requestAnimationFrame(timer)
  OUT.textContent = secToTimer((new Date().getTime() - origin) / 1000)
}

requestAnimationFrame(timer)
span {font-size:4rem}
<span id="OUT"></span>
<br>
<button onclick="origin = new Date().getTime()">RESET</button>
<button onclick="requestAnimationFrame(timer)">RESTART</button>
<button onclick="cancelAnimationFrame(job)">STOP</button>

Пример использования, связанный с медиа-элементом

/* Seconds to (STRING)HH:MM:SS.MS --------------*/
function secToTimer(sec){
  let o = new Date(0)
  let p =  new Date(sec*1000)  
  return new Date(p.getTime()-o.getTime())
    .toISOString()
    .split("T")[1]
    .split("Z")[0]
}

VIDEO.addEventListener("timeupdate", function(e){
  OUT.textContent = secToTimer(e.target.currentTime)
}, false)
span {font-size:4rem}
<span id="OUT"></span><br>
<video id="VIDEO" width="400" controls autoplay>
  <source src="https://www.w3schools.com/html/mov_bbb.mp4" type="video/mp4">
</video>


Вне вопроса эти функции написаны на php:

<?php 
/* HH:MM:SS to (FLOAT)seconds ------------------*/
function timerToSec($timer){
  $vtimer = explode(":",$timer);
  $vhours = (int)$vtimer[0];
  $vminutes = (int)$vtimer[1];
  $vseconds = (float)$vtimer[2];
  return $vhours * 3600 + $vminutes * 60 + $vseconds;
}
/* Seconds to (STRING)HH:MM:SS -----------------*/
function secToTimer($sec){
  return explode(" ", date("H:i:s", $sec))[0];  
}

1
Вы можете опустить + "." + p.getMilliseconds(), просто используя new Date(p.getTime()-o.getTime()).toISOString().split("T")[1].split("Z")[0]
JayJay

1
Выглядит хорошо, да ваша версия это быстрее: См бенчмарк jsben.ch/4sQY1 Принято редактировать! Спасибо.
NVRM

4
var time1 = date1.getTime();
var time2 = date2.getTime();
var totalMilisec = time2 - time1;

alert(DateFormat('hh:mm:ss',new Date(totalMilisec)))

 /* ----------------------------------------------------------
 *  Field        | Full Form          | Short Form
 *  -------------|--------------------|-----------------------
 *  Year         | yyyy (4 digits)    | yy (2 digits)
 *  Month        | MMM (abbr.)        | MM (2 digits)
                 | NNN (name)         |
 *  Day of Month | dd (2 digits)      | 
 *  Day of Week  | EE (name)          | E (abbr)
 *  Hour (1-12)  | hh (2 digits)      | 
 *  Minute       | mm (2 digits)      | 
 *  Second       | ss (2 digits)      | 
 *  ----------------------------------------------------------
 */
function DateFormat(formatString,date){
    if (typeof date=='undefined'){
    var DateToFormat=new Date();
    }
    else{
        var DateToFormat=date;
    }
    var DAY         = DateToFormat.getDate();
    var DAYidx      = DateToFormat.getDay();
    var MONTH       = DateToFormat.getMonth()+1;
    var MONTHidx    = DateToFormat.getMonth();
    var YEAR        = DateToFormat.getYear();
    var FULL_YEAR   = DateToFormat.getFullYear();
    var HOUR        = DateToFormat.getHours();
    var MINUTES     = DateToFormat.getMinutes();
    var SECONDS     = DateToFormat.getSeconds();

    var arrMonths = new Array("January","February","March","April","May","June","July","August","September","October","November","December");
    var arrDay=new Array('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday');
    var strMONTH;
    var strDAY;
    var strHOUR;
    var strMINUTES;
    var strSECONDS;
    var Separator;

    if(parseInt(MONTH)< 10 && MONTH.toString().length < 2)
        strMONTH = "0" + MONTH;
    else
        strMONTH=MONTH;
    if(parseInt(DAY)< 10 && DAY.toString().length < 2)
        strDAY = "0" + DAY;
    else
        strDAY=DAY;
    if(parseInt(HOUR)< 10 && HOUR.toString().length < 2)
        strHOUR = "0" + HOUR;
    else
        strHOUR=HOUR;
    if(parseInt(MINUTES)< 10 && MINUTES.toString().length < 2)
        strMINUTES = "0" + MINUTES;
    else
        strMINUTES=MINUTES;
    if(parseInt(SECONDS)< 10 && SECONDS.toString().length < 2)
        strSECONDS = "0" + SECONDS;
    else
        strSECONDS=SECONDS;

    switch (formatString){
        case "hh:mm:ss":
            return strHOUR + ':' + strMINUTES + ':' + strSECONDS;
        break;
        //More cases to meet your requirements.
    }
}

4

Я просто хотел дать небольшое объяснение хорошему ответу выше:

var totalSec = new Date().getTime() / 1000;
var hours = parseInt( totalSec / 3600 ) % 24;
var minutes = parseInt( totalSec / 60 ) % 60;
var seconds = totalSec % 60;

var result = (hours < 10 ? "0" + hours : hours) + "-" + (minutes < 10 ? "0" + minutes : minutes) + "-" + (seconds  < 10 ? "0" + seconds : seconds);

Во второй строке, поскольку в 1 часе 3600 секунд, мы делим общее количество секунд на 3600, чтобы получить общее количество часов. Мы используем parseInt для удаления любого десятичного числа. Если totalSec был 12600 (3 с половиной часа), то parseInt (totalSec / 3600) вернул бы 3, так как у нас будет 3 полных часа. Зачем нам нужен% 24 в этом случае? Если мы превышаем 24 часа, скажем, у нас есть 25 часов (90000 секунд), то по модулю здесь мы снова вернемся к 1, а не к 25. Это ограничивает результат в пределах 24-часового лимита, так как есть 24 часа В течение одного дня.

Когда вы видите что-то вроде этого:

25 % 24

Думайте об этом так:

25 mod 24 or what is the remainder when we divide 25 by 24

4

Вовлечение в эту старую ветку - ОП указывал ЧЧ: ММ: СС, и многие решения работают, пока вы не поймете, что вам нужно более 24 часов в списке. И, может быть, вы не хотите больше, чем одну строку кода. Ну вот:

d=(s)=>{f=Math.floor;g=(n)=>('00'+n).slice(-2);return f(s/3600)+':'+g(f(s/60)%60)+':'+g(s%60)}

Возвращает H +: MM: SS. Чтобы использовать это, просто используйте:

d(91260);     // returns "25:21:00"
d(960);       // returns "0:16:00"

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


1
Можете ли вы предоставить расширенную / читающую версию своего кода, чтобы мы могли легче видеть, что происходит? Спасибо.
Кимбалл

3

Вы пытались добавить секунды к объекту Date?

var dt = new Date();
dt.addSeconds(1234);

Пример: https://jsfiddle.net/j5g2p0dc/5/

Обновлено: пример ссылки отсутствует, поэтому я создал новую.


Uncaught TypeError: dt.addSeconds не является функцией
Ikrom

@Ikrom, проверьте пример, я создал новый в jsfiddle, так как старый вернул ошибку 404
kpull1

Похоже, я не сообщал, что вы использовали пользовательский метод addSecondsдля объекта Date, как Date.prototype.addSeconds = function(seconds){...}. Да, работает, спасибо за обновление.
Икром

2

Вот функция для преобразования секунд в формат чч-мм-сс на основе ответа Powtac здесь

jsfiddle

/** 
 * Convert seconds to hh-mm-ss format.
 * @param {number} totalSeconds - the total seconds to convert to hh- mm-ss
**/
var SecondsTohhmmss = function(totalSeconds) {
  var hours   = Math.floor(totalSeconds / 3600);
  var minutes = Math.floor((totalSeconds - (hours * 3600)) / 60);
  var seconds = totalSeconds - (hours * 3600) - (minutes * 60);

  // round seconds
  seconds = Math.round(seconds * 100) / 100

  var result = (hours < 10 ? "0" + hours : hours);
      result += "-" + (minutes < 10 ? "0" + minutes : minutes);
      result += "-" + (seconds  < 10 ? "0" + seconds : seconds);
  return result;
}

Пример использования

var seconds = SecondsTohhmmss(70);
console.log(seconds);
// logs 00-01-10

2

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

function secsToTime(secs){
  var time = new Date(); 
  // create Date object and set to today's date and time
  time.setHours(parseInt(secs/3600) % 24);
  time.setMinutes(parseInt(secs/60) % 60);
  time.setSeconds(parseInt(secs%60));
  time = time.toTimeString().split(" ")[0];
  // time.toString() = "HH:mm:ss GMT-0800 (PST)"
  // time.toString().split(" ") = ["HH:mm:ss", "GMT-0800", "(PST)"]
  // time.toTimeString().split(" ")[0]; = "HH:mm:ss"
  return time;
}

Я создаю новый объект Date, изменяю время на мои параметры, преобразовываю объект Date в строку времени и удаляю дополнительные элементы, разбивая строку и возвращая только ту часть, которая требуется.

Я думал, что поделюсь этим подходом, так как он устраняет необходимость в регулярных выражениях, логике и математической акробатике для получения результатов в формате «ЧЧ: мм: сс», и вместо этого он опирается на встроенные методы.

Вы можете ознакомиться с документацией здесь: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date


2

Есть много вариантов решения этой проблемы, и очевидно, что есть хороший вариант, но я хочу добавить еще один оптимизированный код здесь

function formatSeconds(sec) {
     return [(sec / 3600), ((sec % 3600) / 60), ((sec % 3600) % 60)]
            .map(v => v < 10 ? "0" + parseInt(v) : parseInt(v))
            .filter((i, j) => i !== "00" || j > 0)
            .join(":");
}

если вы не хотите форматировать ноль с числом меньше 10, вы можете использовать

function formatSeconds(sec) {
  return parseInt(sec / 3600) + ':' + parseInt((sec % 3600) / 60) + ':' + parseInt((sec % 3600) % 60);

}

Пример кода http://fiddly.org/1c476/1


2

В одной строке, используя решение TJ Crowder:

secToHHMMSS = seconds => `${Math.floor(seconds / 3600)}:${Math.floor((seconds % 3600) / 60)}:${Math.floor((seconds % 3600) % 60)}`

В одной строке другое решение, которое также считает дни:

secToDHHMMSS = seconds => `${parseInt(seconds / 86400)}d ${new Date(seconds * 1000).toISOString().substr(11, 8)}`

Источник: https://gist.github.com/martinbean/2bf88c446be8048814cf02b2641ba276


2
var sec_to_hms = function(sec){
var min, hours;
     sec = sec - (min = Math.floor(sec/60))*60;
     min = min - (hours = Math.floor(min/60))*60;
     return (hours?hours+':':'') + ((min+'').padStart(2, '0')) + ':'+ ((sec+'').padStart(2, '0'));
}
alert(sec_to_hms(2442542));



1

Для любого, кто использует AngularJS, простое решение - отфильтровать значение с помощью API даты , который преобразует миллисекунды в строку на основе запрошенного формата. Пример:

<div>Offer ends in {{ timeRemaining | date: 'HH:mm:ss' }}</div>

Обратите внимание, что для этого требуются миллисекунды, поэтому вы можете захотеть умножить timeRemaining на 1000, если вы конвертируете из секунд (как был сформулирован исходный вопрос).


1

Я столкнулся с случаем, когда некоторые упоминали, что количество секунд больше дня. Вот адаптированная версия ответа @Harish Anchu с самым высоким рейтингом, который учитывает более длительные периоды времени:

function secondsToTime(seconds) {
  const arr = new Date(seconds * 1000).toISOString().substr(11, 8).split(':');

  const days = Math.floor(seconds / 86400);
  arr[0] = parseInt(arr[0], 10) + days * 24;

  return arr.join(':');
}

Пример:

secondsToTime(101596) // outputs '28:13:16' as opposed to '04:13:16'

1
String.prototype.toHHMMSS = function () {
    var sec_num = parseInt(this, 10); // don't forget the second param
    var hours   = Math.floor(sec_num / 3600);
    var minutes = Math.floor((sec_num - (hours * 3600)) / 60);
    var 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;}
    return hours+':'+minutes+':'+seconds;
}

Пример использования

alert("186".toHHMMSS());

1

Ни один из ответов здесь не удовлетворяет моим требованиям, так как я хочу быть в состоянии справиться

  1. Большое количество секунд (дней) и
  2. Отрицательные числа

Несмотря на то, что они не требуются ФП, эффективная практика заключается в том, чтобы охватить крайние случаи, особенно когда это требует небольших усилий.

Совершенно очевидно, что ОП означает НЕСКОЛЬКО секунд, когда он говорит секунды . Зачем привязывать вашу функцию String?

function secondsToTimeSpan(seconds) {
    const value = Math.abs(seconds);
    const days = Math.floor(value / 1440);
    const hours = Math.floor((value - (days * 1440)) / 3600);
    const min = Math.floor((value - (days * 1440) - (hours * 3600)) / 60);
    const sec = value - (days * 1440) - (hours * 3600) - (min * 60);
    return `${seconds < 0 ? '-':''}${days > 0 ? days + '.':''}${hours < 10 ? '0' + hours:hours}:${min < 10 ? '0' + min:min}:${sec < 10 ? '0' + sec:sec}`
}
secondsToTimeSpan(0);       // => 00:00:00
secondsToTimeSpan(1);       // => 00:00:01
secondsToTimeSpan(1440);    // => 1.00:00:00
secondsToTimeSpan(-1440);   // => -1.00:00:00
secondsToTimeSpan(-1);      // => -00:00:01

1
secondsToTimeSpan(8991)возвращается, 6.00:05:51тогда как я думаю, что это должно вернуться00:02:29:51
user1063287

0

Я использовал этот код раньше, чтобы создать простой объект timepan:

function TimeSpan(time) {
this.hours = 0;
this.minutes = 0;
this.seconds = 0;

while(time >= 3600)
{
    this.hours++;
    time -= 3600;
}

while(time >= 60)
{
    this.minutes++;
    time -= 60;
}

this.seconds = time;
}

var timespan = new Timespan(3662);

1
зацикливание результатов - очень плохая методика кодирования, и ее никогда не следует использовать, так как это приведет к снижению вычислительной мощности и
замедлению работы
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.