JavaScript Sekunden bis Zeit Zeichenfolge mit Format hh: mm: ss

300

Ich möchte eine Zeitdauer, dh die Anzahl der Sekunden, in eine durch Doppelpunkte getrennte Zeitzeichenfolge (hh: mm: ss) konvertieren.

Ich habe hier einige nützliche Antworten gefunden, aber alle sprechen von der Konvertierung in das Format x Stunden und x Minuten.

Gibt es also einen winzigen Ausschnitt, der dies in jQuery oder nur in rohem JavaScript ausführt?

medk
quelle
11
Benchmarks einiger der vorgeschlagenen Antworten in diesem Thread. jsperf.com/ms-to-hh-mm-ss-time-format
Claudijo

Antworten:

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

Sie können es jetzt wie folgt verwenden:

alert("5678".toHHMMSS());

Arbeitsausschnitt:

powtac
quelle
1
Vielen Dank für die Idee des Prototyps. Mir gefällt, wie einfach es ist, sie zu nennen. Ich habe die Nummer als Prototyp erstellt, damit ich sie auch bei ihnen anrufen kann. Ich fand auch diese Antwort , die die Stunden und Minuten entfernen würde, wenn sie nicht benötigt würden.
Alunsford3
21
benutze den Operator "%" >> var Minuten = Math.floor ((sec_num% 3600) / 60); var Sekunden = Math.floor (sec_num% 60);
IvanM
3
ah danke. Ich sehe es nicht als Zeichenfolge in beide Richtungen, bis Sie .toString () für die Ganzzahl aufrufen. Sie können es umgekehrt funktionieren lassen, indem Sie auch int analysieren
Sonic Soul
51
Setzen Sie den Prototyp nicht ein, sondern erstellen Sie eine Utility-Funktion.
Michael J. Calkins
15
Prototyp für so etwas modifizieren? 390 positive Stimmen? Ernsthaft?
Lukas Liesis
197

Sie können dies ohne externe JS-Bibliothek mithilfe der JS Date-Methode wie folgt tun:

var date = new Date(0);
date.setSeconds(45); // specify value for SECONDS here
var timeString = date.toISOString().substr(11, 8);
console.log(timeString)

Harish Anchu
quelle
4
Warum ist diese Antwort so niedrig? Ich bekomme es im Jahr 2011 wahrscheinlich IE 7 und 8 war die Basis, die es nicht unterstützen wird, aber es ist Ende 2014, also sollte diese einfache, unkomplizierte Lösung viel höher sein.
Emil Borconi
2
Von MDN: Wenn ein von Ihnen angegebener Parameter außerhalb des erwarteten Bereichs liegt, versucht setSeconds (), die Datumsinformationen im Date-Objekt entsprechend zu aktualisieren. Wenn Sie beispielsweise 100 für Sekundenwert verwenden, werden die im Datumsobjekt gespeicherten Minuten um 1 erhöht und 40 für Sekunden. Also ja, sieht gut aus!
Andrew
40
Ich mag diese Antwort. Es kann noch kürzer sein : new Date(1000 * seconds).toISOString().substr(11, 8).
Bohumir Zamecnik
4
Gute Antwort. Sie können .replace(/^[0:]+/, "")after verwenden substr, um alle Nullen und :vom Anfang der Zeichenfolge zu entfernen .
Palo
1
Fügen Sie dies vor, um die Zeit über 24 Stunden zu bewältigen. parseInt (d / 86400) + "d"
Tofandel
82

Um den Zeitteil im Format abzurufen hh:MM:ss, können Sie diesen regulären Ausdruck verwenden:

(Dies wurde oben im selben Beitrag von jemandem erwähnt, danke dafür.)

    var myDate = new Date().toTimeString().replace(/.*(\d{2}:\d{2}:\d{2}).*/, "$1");
    console.log(myDate)

Raj
quelle
8
+1 - Super einfach; Vielen Dank! Ich habe gerade eine Variante davon verwendet, um nur die Minuten und Sekunden var myDate = new Date().toTimeString().replace(/.*(\d{2}:\d{2})(:\d{2}).*/, "$1");
anzuzeigen
1
sollte das nicht "neues Datum (null, null, null, null, null, timeInSecs) sein .toTimeString (). replace (/.* (\ d {2} :) (\ d {2}: \ d {2 }). * /, "$ 2") "?
Obie
6
Die Verwendung von replaceist verwirrend. Warum nicht verwenden new Date(null, null, null, null, null, timeInSeconds).toTimeString().match(/\d{2}:\d{2}:\d{2}/)[0]?
Călin Darie
4
Dies ist in Ordnung, um eine bestimmte Zeit anzuzeigen. Beachten Sie jedoch, dass es bei der Frage (und anderen Antworten hier) darum geht, eine Dauer anzuzeigen, dh eine bestimmte Anzahl von Sekunden, unabhängig von der aktuellen Zeit.
Mahemoff
4
Einfachere Version davon:new Date().toTimeString().split(" ")[0]
Henrik N
52

Ich empfehle gewöhnliches Javascript mit dem Date-Objekt:

var seconds = 9999;
// multiply by 1000 because Date() requires miliseconds
var date = new Date(seconds * 1000);
var hh = date.getUTCHours();
var mm = date.getUTCMinutes();
var ss = date.getSeconds();
// If you were building a timestamp instead of a duration, you would uncomment the following line to get 12-hour (not 24) time
// if (hh > 12) {hh = hh % 12;}
// These lines ensure you have two-digits
if (hh < 10) {hh = "0"+hh;}
if (mm < 10) {mm = "0"+mm;}
if (ss < 10) {ss = "0"+ss;}
// This formats your string to HH:MM:SS
var t = hh+":"+mm+":"+ss;
document.write(t);

(Natürlich ist dem erstellten Datumsobjekt ein tatsächliches Datum zugeordnet, aber diese Daten sind irrelevant, sodass Sie sich für diese Zwecke keine Sorgen machen müssen.)

JellicleCat
quelle
Es scheint das Datum in der lokalen Zeitzone zu machen, was in meinem Fall 1 Stunde zur Zeit hinzufügt. Mit Sekunden = 0 erhalte ich "01:00:00" (Do 01.01.1970 01:00:00 GMT + 0100 (MEZ)), was falsch ist.
Mivk
3
Ich erhalte ein korrektes Ergebnis, wenn ich date.getUTCHours()und verwende date.getUTCMinutes().
Mivk
Ich verstehe nicht, warum Sie einen 12-Stunden-Zeitstempel zurückgeben, wenn er nach einer Dauer gefragt hat?
Nathan C. Tresch
@JellicleCat Geändert in +1 und netter Name.
Nathan C. Tresch
1
Ich mag das, aber es geht davon aus, dass die Dauer weniger als 24 Stunden beträgt
Rory
40

Eine Google-Suche ergab dieses Ergebnis :

function secondsToTime(secs)
{
    secs = Math.round(secs);
    var hours = Math.floor(secs / (60 * 60));

    var divisor_for_minutes = secs % (60 * 60);
    var minutes = Math.floor(divisor_for_minutes / 60);

    var divisor_for_seconds = divisor_for_minutes % 60;
    var seconds = Math.ceil(divisor_for_seconds);

    var obj = {
        "h": hours,
        "m": minutes,
        "s": seconds
    };
    return obj;
}
Ash Burlaczenko
quelle
8
secondsToTime(119.9)=> Object {h: 0, m: 1, s: 60}. Um dies zu beheben, fügen Sie secs = Math.round(secs);am Anfang der Methode hinzu. Natürlich haben wir diesen Fehler während der Demo gesehen ...
Benjamin Crouzier
29

Variation eines Themas. Behandelt einstellige Sekunden etwas anders

seconds2time(0)  ->  "0s" 
seconds2time(59) -> "59s" 
seconds2time(60) -> "1:00" 
seconds2time(1000) -> "16:40" 
seconds2time(4000) -> "1:06:40"

function seconds2time (seconds) {
    var hours   = Math.floor(seconds / 3600);
    var minutes = Math.floor((seconds - (hours * 3600)) / 60);
    var seconds = seconds - (hours * 3600) - (minutes * 60);
    var time = "";

    if (hours != 0) {
      time = hours+":";
    }
    if (minutes != 0 || time !== "") {
      minutes = (minutes < 10 && time !== "") ? "0"+minutes : String(minutes);
      time += minutes+":";
    }
    if (time === "") {
      time = seconds+"s";
    }
    else {
      time += (seconds < 10) ? "0"+seconds : String(seconds);
    }
    return time;
}
Jottos
quelle
Vielen Dank, dass Sie mir eine Stunde Zeit gespart haben
Starsinmypockets
29

Hier ist meine Meinung dazu:

function formatTime(seconds) {
  const h = Math.floor(seconds / 3600);
  const m = Math.floor((seconds % 3600) / 60);
  const s = Math.round(seconds % 60);
  return [
    h,
    m > 9 ? m : (h ? '0' + m : m || '0'),
    s > 9 ? s : '0' + s
  ].filter(Boolean).join(':');
}

Erwartete Ergebnisse:

const expect = require('expect');
expect(formatTime(0)).toEqual('0:00');
expect(formatTime(1)).toEqual('0:01');
expect(formatTime(599)).toEqual('9:59');
expect(formatTime(600)).toEqual('10:00');
expect(formatTime(3600)).toEqual('1:00:00');
expect(formatTime(360009)).toEqual('100:00:09');
expect(formatTime(0.2)).toEqual('0:00');
Tom Esterez
quelle
Sie könnten dies schreiben als: const formatTime = (seconds, h = Math.floor(seconds / 3600), m = Math.floor((seconds % 3600) / 60), s = seconds % 60) => [h, m > 9 ? m : '0' + m, s > 9 ? s : '0' + s].filter(s => s).join(':');
Ruben Stolk
2
@RubenStolk Ich finde es etwas verwirrend, eine Funktion zu haben, die zwei secondArgumente akzeptiert . Ich finde meine Version klarer, auch wenn sie etwas ausführlicher ist.
Tom Esterez
seconds: numberTyp Anmerkungen, in es6?
Olian04
1
@pstanton Trailing Comma wird seit IE9 unterstützt: caniuse.com/#feat=mdn-javascript_grammar_trailing_commas . Ich persönlich habe mich entschieden, diese alten Browser jetzt zu ignorieren. Aber du hast recht, ich habe es entfernt, damit die Antwort allgemeiner ist.
Tom Esterez
1
Tolle Lösung. Vielleicht ändern Sie einfach die Sekunden alsconst s = Math.round(seconds % 60);
Raff
16

Ich mag die erste Antwort. Es gibt einige Optimierungen:

  • Quelldaten sind eine Zahl. zusätzliche Berechnungen sind nicht erforderlich.

  • viel überschüssiges Computing

Ergebniscode:

Number.prototype.toHHMMSS = function () {
    var seconds = Math.floor(this),
        hours = Math.floor(seconds / 3600);
    seconds -= hours*3600;
    var minutes = Math.floor(seconds / 60);
    seconds -= minutes*60;

    if (hours   < 10) {hours   = "0"+hours;}
    if (minutes < 10) {minutes = "0"+minutes;}
    if (seconds < 10) {seconds = "0"+seconds;}
    return hours+':'+minutes+':'+seconds;
}
Serge K.
quelle
1
Ich denke, diese Funktion ist eine Funktion, die in der Front verwendet wird, und deshalb habe ich den Prototyp String und nicht Number. Und Number kann immer eine Zeichenfolge sein, aber nicht umgekehrt.
Powtac
3
Ich denke, es Numberist richtig, weil secondses tatsächlich eine Zahl ist. Sie sollten aus einem String konvertieren, bevor Sie diese Funktion verwenden, was das Richtige ist!
Caesarsol
2
Eine hochgestimmte Antwort, genau wie diese, ist schlecht. Ich wette, Sie brauchen nicht ALLE Zahlen, um diese Methode zu haben. Ändern Sie den Prototyp nicht für zufällige Dienstprogramme.
Lukas Liesis
oder einfach nur als Prototyp und als Funktion numToHHMMSS oder strTOHHMMSS
yeahdixon
Diese Lösung funktioniert, während die ausgewählte Lösung für bestimmte Werte Sekunden von 60 generiert.
AndroidDev
14

Verwenden der erstaunlichen Bibliothek moment.js :

function humanizeDuration(input, units ) { 
  // units is a string with possible values of y, M, w, d, h, m, s, ms
  var duration = moment().startOf('day').add(units, input),
    format = "";

  if(duration.hour() > 0){ format += "H [hours] "; }

  if(duration.minute() > 0){ format += "m [minutes] "; }

  format += " s [seconds]";

  return duration.format(format);
}

Auf diese Weise können Sie eine beliebige Dauer angeben, sei es Stunden, Minuten, Sekunden, Mühlen, und eine für Menschen lesbare Version zurückgeben.

Pradeep
quelle
14
function formatTime(seconds) {
    return [
        parseInt(seconds / 60 / 60),
        parseInt(seconds / 60 % 60),
        parseInt(seconds % 60)
    ]
        .join(":")
        .replace(/\b(\d)\b/g, "0$1")
}
Meiyang
quelle
Eine weitere Erklärung, warum diese Antwort für den Fragesteller funktionieren würde oder was in der ursprünglichen Frage möglicherweise falsch war, würde dazu beitragen, die Qualität dieser Antwort zu verbessern.
Josh Burgess
1
Ziemlich selbsterklärend und gute Antwort, reduzierte und vereinfachte die Top-Antwort.
AlexioVay
Präzise Antwort
:)
11

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

Ergebnis 15:08:03

Artem Kyba
quelle
Nett, danke! Eine kleine Verbesserung, die ich für meine Anforderungen vorgenommen habe, war die Konvertierung einer Dauer in Millisekunden in HH: MM: SS - new Date(new Date().getTime() - startTime).toUTCString().split(" ")[4]wo startTimezuvor festgelegt startTime = new Date().getTime();. (Ich musste verwenden, toUTCString()weil sonst die Zeiten eine Stunde aus waren.)
Richard Wiseman
10

Es ist ziemlich einfach,

function toTimeString(seconds) {
  return (new Date(seconds * 1000)).toUTCString().match(/(\d\d:\d\d:\d\d)/)[0];
}
Hung Vo
quelle
Dies funktioniert nur, wenn Ihre Zeitdauer weniger als 1 Tag beträgt. Aber sonst ganz nett.
CJBarth
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);

Ergebnis:

1d 10h 17m 36s
Andy Wu
quelle
6

Die Antwort von Webjins hat mir am besten gefallen, daher habe ich sie auf die Anzeige von Tagen mit Anzeigensuffix erweitert, die Anzeige an Bedingungen geknüpft und als Suffix in einfachen Sekunden eingefügt:

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

gibt "3d 16:32:12" oder "16:32:12" oder "32:12" oder "12s" zurück

nïkö
quelle
Dies wird für eine Dauer von 24 Tagen oder länger falsch sein
Charlie Martin
Warum vergleichen Sie Zeichenfolgen größer als 0?
Jimmy Kane
@ JimmyKane weil automatisches Typecasting - ich liebe es! (Plus: Code ist einfacher zu lesen (Sie haben aus einem bestimmten Grund Typografie, aber hören wir auf zu trollen (wir beide)). Plus: Die Funktion würde nur fehlschlagen, wenn t NaN ist. Wenn Sie also Sicherheit wünschen: tun es am Eingang!)
nïkö
@ nïkö Ok, ich verstehe, aber strengere neue JS-Versionen, Linters usw. können sich darüber beschweren. Ich sage nur, versteh mich nicht falsch. Ich mag Ihre Antwort
Jimmy Kane
6

Ich habe Powtacs Antwort geliebt, aber ich wollte sie in angle.js verwenden, also habe ich einen Filter mit seinem Code erstellt.

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

Es ist funktional identisch, außer dass ich ein optionales Dezimalfeld hinzugefügt habe, um Sekundenbruchteile anzuzeigen. Verwenden Sie es wie jeden anderen Filter:

{{ elapsedTime | HHMMSS }} zeigt an: 01:23:45

{{ elapsedTime | HHMMSS : 3 }} zeigt an: 01:23:45.678

Mordred
quelle
Ich habe zwei datetime-Objekte und möchte die Differenz dieses 2 datetime-Objekts berechnen und die Ausgabe wie folgt zurückgeben: Stunde: Minuten: Sekunden mit zweistelligen Zahlen wie: 01: 02: 45. Können Sie mir bitte etwas sagen oder mich wenig führen? mit deinem Code?
Learning-Overthinker-Confused
4

Ich denke, was die Leistung betrifft, ist dies bei weitem die schnellste:

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
Rutger van Baren
quelle
Wirklich unglaublich. Glückwunsch!
Brynner Ferreira
Schön ... und> 24 Stunden sicher.
Jeffz
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;
}

Beispiele

    toHHMMSS (111); 
    "01:51"

    toHHMMSS (4444);
    "01:14:04"

    toHHMMSS (33);
    "00:33"
Maschi
quelle
Ich würde auch Math.floor()die Sekunden aufschreiben, da sie möglicherweise in Dezimalstellen angegeben werden. (Ist mit mir passiert.)
Winter
3

Hier ist noch eine andere Version, die auch Tage behandelt:

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;
}
M Katz
quelle
3

Ein regulärer Ausdruck kann verwendet werden, um die Zeitzeichenfolge in der Zeichenfolge toString()abzugleichen, die von der Methode des Date-Objekts zurückgegeben wurde. Diese ist wie folgt formatiert: "Do 05.07.2012 02:45:12 GMT + 0100 (GMT Daylight Time)". Beachten Sie, dass diese Lösung die Zeit seit der Epoche verwendet: Mitternacht des 1. Januar 1970. Diese Lösung kann einzeilig sein, obwohl die Aufteilung das Verständnis erheblich erleichtert.

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");
}
Ninjakannon
quelle
2

So habe ich es gemacht. Es scheint ziemlich gut zu funktionieren und ist extrem kompakt. (Es werden jedoch viele ternäre Operatoren verwendet.)

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
}

... und zum Formatieren von Strings ...

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

Mit der folgenden Funktion können Sie die Zeit (in Sekunden) in das HH:MM:SSFormat konvertieren:

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 : ':' );
}

Ohne ein Trennzeichen zu übergeben, wird es :als (Standard-) Trennzeichen verwendet:

time = convertTime(13551.9941351); // --> OUTPUT = 03:45:51

Wenn Sie -als Trennzeichen verwenden möchten , übergeben Sie es einfach als zweiten Parameter:

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

Demo

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

Siehe auch diese Geige .

John Slegers
quelle
2

Es gibt eine neue Methode für Zeichenfolgen im Block: padStart

const str = '5';
str.padStart(2, '0'); // 05

Hier ist ein Anwendungsbeispiel: YouTube-Dauer in 4 Zeilen JavaScript

Boris Yakubchik
quelle
1

So habe ich es gemacht

function timeFromSecs(seconds)
{
    return(
    Math.floor(seconds/86400)+'d :'+
    Math.floor(((seconds/86400)%1)*24)+'h : '+
    Math.floor(((seconds/3600)%1)*60)+'m : '+
    Math.round(((seconds/60)%1)*60)+'s');
}

timeFromSecs (22341938) gibt '258d 14h 5m 38s' zurück.

dt192
quelle
1

Ich persönlich bevorzuge die führende Einheit (Tage, Stunden, Minuten) ohne führende Nullen. Sekunden sollten jedoch immer von Minuten (0:13) angeführt werden. Diese Präsentation kann ohne weitere Erklärung (Kennzeichnung als min, sec (s) usw.) leicht als "Dauer" betrachtet werden und kann in verschiedenen Sprachen verwendet werden (Internationalisierung).

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

// Nachahmung der serverseitigen (.net, C #) Dauer Formatierung wie:

    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));
    }
Peter Zehnder
quelle
1

Sie können Momement.js mit dem Plugin für das Moment-Dauer-Format verwenden :

var seconds = 3820;
var duration = moment.duration(seconds, 'seconds');
var formatted = duration.format("hh:mm:ss");
console.log(formatted); // 01:03:40
<!-- Moment.js library -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>

<!-- moment-duration-format plugin -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-duration-format/1.3.0/moment-duration-format.min.js"></script>

Siehe auch diese Geige

Oleksiy Kachynskyy
quelle
Funktioniert wie ein Zauber (außer Format, das nicht definiert ist), um eine Dauer in einem Objekt mit Monaten, Tagen, Stunden, Minuten und Sekunden zu konvertieren
Pi Home Server
1

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

Dabei ist der Gebietsschema-Parameter ("en", "de" usw.) optional

JukkaP
quelle
1
secToHHMM(number: number) {
    debugger;
    let hours = Math.floor(number / 3600);
    let minutes = Math.floor((number - (hours * 3600)) / 60);
    let seconds = number - (hours * 3600) - (minutes * 60);
    let H, M, S;
    if (hours < 10) H = ("0" + hours);
    if (minutes < 10) M = ("0" + minutes);
    if (seconds < 10) S = ("0" + seconds);
    return (H || hours) + ':' + (M || minutes) + ':' + (S || seconds);
}
Israel
quelle
1

Hier ist ein Einzeiler, der für 2019 aktualisiert wurde:

//your date
var someDate = new Date("Wed Jun 26 2019 09:38:02 GMT+0100") 

var result = `${String(someDate.getHours()).padStart(2,"0")}:${String(someDate.getMinutes()).padStart(2,"0")}:${String(someDate.getSeconds()).padStart(2,"0")}`

//result will be "09:38:02"
DataGreed
quelle
Ich denke, das OP möchte eine Dauer (Sekunden) konvertieren, kein DateObjekt.
mrdaliri
Ups, mein schlechtes :(
DataGreed
1

Hier ist eine ziemlich einfache Lösung, die auf die nächste Sekunde rundet!

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

CommandoScorch
quelle
1

Dies ist eine, die ich kürzlich für MM: SS geschrieben habe. Es ist nicht genau auf die Frage, aber es ist ein anderes Einzeiler-Format.

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

Bearbeiten: Dies wurde aus Gründen der Abwechslung hinzugefügt, aber die beste Lösung hier ist https://stackoverflow.com/a/25279399/639679 unten.

Matt Kenefick
quelle