it-roy-ru.com

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

Как я могу преобразовать секунды в строку HH-MM-SS, используя JavaScript?

191
Hannoun Yassir

Разве вы не знаете datejs ? это надо знать.

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

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

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

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

103
Cleiton

Вы можете сделать это без какой-либо внешней библиотеки 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);
317
Harish Anchu

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

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

Пример:

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

console.log("hours: " + hours);
console.log("minutes: " + minutes);
console.log("seconds: " + seconds);

// If you want strings with leading zeroes:
minutes = String(minutes).padStart(2, "0");
hours = String(hours).padStart(2, "0");
seconds = String(seconds).padStart(2, "0");
console.log(hours + ":" + minutes + ":" + seconds);
122
T.J. Crowder

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

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

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

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
26
Santiago Hernández
function formatSeconds(seconds)
{
    var date = new Date(1970,0,1);
    date.setSeconds(seconds);
    return date.toTimeString().replace(/.*(\d{2}:\d{2}:\d{2}).*/, "$1");
}
19
Dima L.

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

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

(Источник здесь )

15
Waggers
     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"

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

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

10
sheelpriy

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

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

Вот расширение класса 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>
6
Burak Kalkan

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

 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
ColossalChris

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

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

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

4
John Slegers

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

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

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

4
Faruque Ahamed Mollick

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

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
Donato

Вовлечение в эту старую ветку - ОП указывал ЧЧ: ММ: СС, и многие решения работают, пока вы не поймете, что вам нужно более 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"

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

4
tsizzle
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.
    }
}
3
bgosalci

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

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

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

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

3
kpull1

В одной строке, используя T.J. Решение Краудера:

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
KaKi87

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

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
luis.madrigal
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));
2
user40521

Вот функция для преобразования секунд в формат чч-мм-сс, основанная на ответе 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
svnm

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

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
Amit

Вы также можете использовать следующий код:

int ss = nDur%60;
nDur   = nDur/60;
int mm = nDur%60;
int hh = nDur/60;
1
Madhu S. Kapoor
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
Fouad Mekkey

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

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

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

1
Henrik Christensen

Я столкнулся с случаем, когда некоторые упоминали, что количество секунд больше дня. Вот адаптированная версия ответа @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
ericgio

Я использовал этот код раньше, чтобы создать простой объект 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);
0
smack0007

Может быть, что-то вроде этого:

var Convert = function (time) {
    const HOUR = 60 * 60;
    const MINUTE = 60;

    var minutesInSeconds = time % HOUR;
    var hours = Math.floor(time / HOUR);
    var minutes = Math.floor(minutesInSeconds / MINUTE)
    var seconds = minutesInSeconds % MINUTE;

    return hours.padStart(2, 0) + ':' + minutes.padStart(2, 0) + ':' + seconds.padStart(2, 0);
}
0
Ziv Ben-Or

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

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

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

Совершенно очевидно, что ОП означает НЕСКОЛЬКО секунд, когда он говорит секунды. Зачем привязывать вашу функцию к 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
0
Duoc Tran

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

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

0
Artem Kyba