Sekunden mit JavaScript in HH-MM-SS konvertieren?

Antworten:

109

Kennst du keine Datumsangaben ? es ist ein Muss zu wissen.

Schreiben Sie mit datejs einfach Folgendes:

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

--aktualisieren

Heutzutage ist date.js veraltet und wird nicht mehr gepflegt. Verwenden Sie daher " Moment.js ", was viel besser ist, wie von TJ Crowder hervorgehoben.

--update 2

Bitte verwenden Sie @ Franks eine einzeilige Lösung:

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

Es ist bei weitem die beste Lösung.

Cleiton
quelle
11
@Yassir und Cleiton: FWIW, DateJS wurde seit Jahren nicht mehr gewartet und weist einige herausragende Fehler auf (obwohl sie meines Wissens hauptsächlich Parsing und Mitternacht betreffen). momentjs scheint ziemlich gut zu sein und wird derzeit gewartet.
TJ Crowder
1
@Cleiton, Ihre aktualisierte Antwort ist nicht vollständig. Ich habe es so versucht wie es ist und bekam : TypeError: Object [object Date] has no method 'clearTime'.
Hamish Grubijan
19
Zugegeben, Moment.js ist nicht so groß, aber wenn Sie nur Sekunden in hh: mm: ss konvertieren, scheint es ein bisschen übertrieben zu sein. Verwenden Sie lieber eine der in diesen oder anderen Antworten vorgeschlagenen Funktionen.
Ola Karlsson
5
Ich denke, die andere Lösung ist besser, als eine andere js-Bibliothek in den Mix zu werfen.
Donato
4
Das Hinzufügen einer Bibliothek für eine einfache Aktion sollte meiner Meinung nach nicht als Antwort akzeptiert werden. Ja, das funktioniert, aber es gibt bessere Lösungen !!!
Andris
403

Sie können dies ohne externe JavaScript-Bibliothek mithilfe der folgenden JavaScript-Datumsmethode tun:

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

Oder gemäß dem Kommentar von @Frank ; ein Einzeiler:

new Date(SECONDS * 1000).toISOString().substr(11, 8);
Harish Anchu
quelle
39
Ich weiß nicht, warum jeder zusätzliche Bibliotheken hinzufügt oder manuell rechnet, wenn dies perfekt funktioniert. Vielen Dank!
jminardi
98
Dies kann sogar auf eine Zeile gekürzt werden: new Date(SECONDS * 1000).toISOString().substr(11, 8);
Frank
4
Brillant. Ohne lib von Drittanbietern. Es ist am besten
Riz
41
Das Problem bei diesem Ansatz ist, dass er nach 24 Stunden überläuft und Sie nicht mehr als diese Zeitspanne anzeigen können. Perfekte Lösung, wenn Sie weniger als 24 Stunden in Sekunden haben.
Renato Gama
1
Dies funktioniert nicht für mich in IE11, ich bekommeObject doesn't support property or method 'toISOString'
NibblyPig
153

Ich glaube nicht, dass eine integrierte Funktion des Standard-Date-Objekts dies auf eine Weise für Sie erledigt, die bequemer ist, als nur selbst zu rechnen.

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

Beispiel:

TJ Crowder
quelle
Es gibt einige Probleme damit, denke ich? Als ich es versuchte, bekam ich Dezimalstellen zurück, sodass 180 Sekunden 0.05in der hoursVariablen zurückgegeben wurden. Ich habe es in eine gelegt, parseIntdie es für meinen Fall repariert hat, aber ich denke nicht, dass das für alles richtig wäre. Trotzdem hat mir das geholfen, also danke!
BT643
@ BT643: Seltsam, dass ich damit nicht umgegangen bin. Ich habe es jetzt getan, du willst es nicht dafür verwenden parseInt, das ist zum Parsen von Strings , nicht zum Manipulieren von Zahlen. Math.floorwäre hier die relevante Operation.
TJ Crowder
1
Ah, ok! Mein Code wurde geändert. Obwohl Sie es wahrscheinlich auch in den Sekunden wollen : seconds = Math.floor(totalSeconds % 60);. Ich habe dort auch gerade ein Dezimalergebnis erhalten.
BT643
@ BT643: totalSeconds % 60kann nur einen Bruchteil haben, wenn totalSecondses einen Bruchteil hat. Ob Sie das Wort ergreifen möchten, hängt davon ab, ob Sie diese Informationen verlieren oder aufbewahren möchten. (Die anderen Bodenoperationen, die wir durchführen, verlieren keine Informationen, weil sie nur die Daten löschen, die in minutesund enden werden seconds.)
TJ Crowder
8
@ HannounYassirconsole.log( hours +':'+ ('0'+minutes).slice(-2) +':'+ ('0'+seconds).slice(-2) );
Xavi Esteve
60

Ich weiß, das ist ein bisschen alt, aber ...

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(":")
}

Es wird ausgegeben:

toHHMMSS(129600) // 36:00:00
toHHMMSS(13545) // 03:45:45
toHHMMSS(180) // 03:00
toHHMMSS(18) // 00:18
Santiago Hernández
quelle
2
Was ist mit Sekundenbruchteilen? 03: 45: 45.xxx?
Mike Stoddart
1
@ SantiagoHernández Großartig! Dies funktioniert jetzt perfekt für Zeiten über 24 Stunden.
Stefnotch
2
+1. Dies oder der TJ sollte die akzeptierte Antwort sein, da dies die einzigen sind, die in Situationen funktionieren, in denen die Dauer 24 Stunden überschreitet (und die Frage die Dauer nicht begrenzt).
George Y.
38

Wie Cleiton in darauf hingewiesen , seine Antwort , moment.js kann dafür verwendet werden:

moment().startOf('day')
        .seconds(15457)
        .format('H:mm:ss');
Der Hochstapler
quelle
5
Was passiert, wenn die Anzahl der Sekunden einen Tag überschreitet?
Gilad Peleg
3
@GiladPeleg Wenn die Anzahl der Sekunden einen Tag überschreitet, wird die Anzahl der Tage intern berechnet und es werden nur die verbleibenden Stunden, Minuten und Sekunden zurückgegeben. Wenn Sie auch die Anzahl der Tage zählen möchten, können Sie es versuchen moment().startOf('year').seconds(30000000).format('DDD HH:mm:ss').
Elquimista
9
Was passiert, wenn die Anzahl der Sekunden ein Jahr überschreitet?
OrangePot
3
@OrangePot Wenn die Anzahl der Sekunden ein Jahr überschreitet, wird die Anzahl der Jahre intern berechnet und es werden nur die verbleibenden Tage, Stunden, Minuten und Sekunden zurückgegeben. Wenn Sie auch die Anzahl der Jahre zählen möchten, können Sie versuchen.format('YYYY DDD HH:mm:ss')
David Callanan
1
Dies kann jedoch nicht optional gemacht werden. Das könnte hässlich aussehen.
Shaedrich
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");
}
Dima L.
quelle
2
formatSeconds (3919); // Gibt 01:05:19 zurück Ausgezeichnete Funktion .. Gefällt mir
Samrat Saha
17

Das macht den Trick:

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

(Von hier bezogen )

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

Wir können diese Funktion viel kürzer und klarer machen, aber das verringert die Lesbarkeit, sodass wir sie so einfach wie möglich und so stabil wie möglich schreiben.

oder Sie können dies hier überprüfen :

sheelpriy
quelle
außerdem ... wenn du alles Datum und Uhrzeit einfach machen willst ... benutze momentJS
sheelpriy
Vielen Dank! Es ist nicht erforderlich, eine Bibliothek in eine Browser-Erweiterung aufzunehmen. Einfach und funktioniert!
Arlo
9

Versuche dies:

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

Hier ist eine Erweiterung der Zahlenklasse. toHHMMSS () konvertiert Sekunden in einen hh: mm: ss-String.

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>

Mustafa Burak Kalkan
quelle
5

Einfach zu verfolgende Version für Noobies:

 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);
ColossalChris
quelle
5

Diese Funktion sollte es tun:

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

Siehe auch diese Geige .

John Slegers
quelle
Könnte Standardparameter wie (input, separator = ":") verwenden. Außerdem hat es nichts zurückgegeben, bis ich es ein wenig geändert habe paste.ee/p/FDNag
madprops
@madprops: Tatsächlich ist die Version in meiner Antwort bereits :als Standard für den separatorParameter festgelegt, wie ich bereits erklärt habe. Dies geschieht durch die Aussage typeof separator !== 'undefined' ? separator : ':'. Außerdem ist Ihre Funktion ziemlich identisch mit meiner, abgesehen von einigen kosmetischen Änderungen, und beide sollten dieselbe Ausgabe erzeugen ... außer dass meine Version eine viel bessere Browserunterstützung bietet. Ihre funktioniert nicht in einer Version von Internet Explorer oder MS Edge <14.
John Slegers
5

Unten ist der angegebene Code, der Sekunden in das hh-mm-ss-Format konvertiert:

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

Holen Sie sich eine alternative Methode aus Konvertieren Sie Sekunden in das HH-MM-SS-Format in JavaScript

Faruque Ahamed Mollick
quelle
Haben Sie aus dieser Antwort Einfügen kopiert ?
StefansArya
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.
    }
}
bgosalci
quelle
4

Ich wollte nur eine kleine Erklärung für die nette Antwort oben geben:

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

In der zweiten Zeile teilen wir die Gesamtzahl der Sekunden durch 3600, um die Gesamtzahl der Stunden zu erhalten, da in einer Stunde 3600 Sekunden vorhanden sind. Wir verwenden parseInt, um Dezimalstellen zu entfernen. Wenn totalSec 12600 (dreieinhalb Stunden) wäre, würde parseInt (totalSec / 3600) 3 zurückgeben, da wir 3 volle Stunden haben werden. Warum brauchen wir in diesem Fall die% 24? Wenn wir 24 Stunden überschreiten, nehmen wir an, wir haben 25 Stunden (90000 Sekunden), dann bringt uns das Modulo hier wieder auf 1 zurück, anstatt 25 zurückzugeben. Es beschränkt das Ergebnis innerhalb eines 24-Stunden-Limits, da es 24 Stunden gibt in einem Tag.

Wenn Sie so etwas sehen:

25 % 24

Stellen Sie sich das so vor:

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

In diesen alten Thread einsteigen - das OP gab HH: MM: SS an, und viele der Lösungen funktionieren, bis Sie feststellen, dass Sie mehr als 24 Stunden benötigen. Und vielleicht möchten Sie nicht mehr als eine einzige Codezeile. Bitte schön:

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

Es gibt H +: MM: SS zurück. Um es zu benutzen, benutze einfach:

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

... Ich habe versucht, die geringstmögliche Menge an Code für einen netten Einzeiler-Ansatz zu verwenden.

Zischen
quelle
1
Können Sie auch eine erweiterte / lesende Version Ihres Codes bereitstellen, damit wir leichter sehen können, was passiert? Vielen Dank.
Kimball
4

Für den Sonderfall von HH: MM: SS.MS (Gleichung: "00: 04: 33.637"), wie er von FFMPEG zur Angabe von Millisekunden verwendet wird .

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

HH drückt die Anzahl der Stunden aus, MM die Anzahl der Minuten für maximal 2 Stellen und SS die Anzahl der Sekunden für maximal 2 Stellen. Das m am Ende drückt den Dezimalwert für SS aus.

/* 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)
)

Beispielverwendung, ein Millisekunden-Transport-Timer:

/* 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>

Anwendungsbeispiel, gebunden an ein Medienelement

/* 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>


Außerhalb der Frage sind diese Funktionen in PHP geschrieben:

<?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];  
}
NVRM
quelle
1
Sie können weglassen, + "." + p.getMilliseconds()indem Sie einfach new Date(p.getTime()-o.getTime()).toISOString().split("T")[1].split("Z")[0]
JayJay
1
Sieht in Ordnung aus, ja, Ihre Version ist schneller: Siehe Benchmark jsben.ch/4sQY1 Akzeptierte Bearbeitung! Danke dir.
NVRM
3

Haben Sie versucht, einem Datumsobjekt Sekunden hinzuzufügen?

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

Ein Beispiel: https://jsfiddle.net/j5g2p0dc/5/

Aktualisiert: Der Beispiellink fehlte, daher habe ich einen neuen erstellt.

kpull1
quelle
Nicht gefangener TypeError: dt.addSeconds ist keine Funktion
Ikrom
@Ikrom überprüfen Sie das Beispiel, ich habe ein neues in jsfiddle erstellt, da das alte 404 Fehler zurückgegeben hat
kpull1
Es sieht so aus, als hätte ich nicht veröffentlicht, dass Sie eine benutzerdefinierte Methode addSecondsfür ein Date-Objekt wie verwendet haben Date.prototype.addSeconds = function(seconds){...}. Ja, es funktioniert, danke für das Update.
Ikrom
2

Hier ist eine Funktion zum Konvertieren von Sekunden in das hh-mm-ss-Format basierend auf der Antwort von powtac hier

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

Beispiel Verwendung

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

Nachdem ich mir alle Antworten angesehen hatte und mit den meisten nicht zufrieden war, kam ich auf diese Idee. Ich weiß, dass ich sehr spät zum Gespräch komme, aber hier ist es trotzdem.

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

Ich erstelle ein neues Datumsobjekt, ändere die Uhrzeit in meine Parameter, konvertiere das Datumsobjekt in eine Zeitzeichenfolge und entferne das zusätzliche Material, indem ich die Zeichenfolge teile und nur den Teil zurückgebe, der benötigt wird.

Ich dachte, ich würde diesen Ansatz teilen, da Regex, Logik und mathematische Akrobatik nicht mehr erforderlich sind, um die Ergebnisse im Format "HH: mm: ss" zu erhalten. Stattdessen werden integrierte Methoden verwendet.

Vielleicht möchten Sie sich die Dokumentation hier ansehen: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date

luis.madrigal
quelle
2

Es gibt viele Möglichkeiten, dieses Problem zu lösen, und es gibt natürlich gute Möglichkeiten, die vorgeschlagen werden. Aber ich möchte hier noch einen optimierten Code hinzufügen

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

Wenn Sie keine formatierte Null mit weniger als 10 Zahlen möchten, können Sie diese verwenden

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

}}

Beispielcode http://fiddly.org/1c476/1

Amit
quelle
2

In einer Zeile mit der Lösung von TJ Crowder:

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

In einer Zeile eine andere Lösung, die auch Tage zählt:

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

Quelle: https://gist.github.com/martinbean/2bf88c446be8048814cf02b2641ba276

KaKi87
quelle
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));
user40521
quelle
1

Sie können auch den folgenden Code verwenden:

int ss = nDur%60;
nDur   = nDur/60;
int mm = nDur%60;
int hh = nDur/60;
Madhu S. Kapoor
quelle
1

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

Ergebnis 15:08:03

Artem Kyba
quelle
1

Für jeden, der AngularJS verwendet, besteht eine einfache Lösung darin, den Wert mit der Datums-API zu filtern , die Millisekunden basierend auf dem angeforderten Format in eine Zeichenfolge konvertiert. Beispiel:

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

Beachten Sie, dass dies Millisekunden erwartet. Wenn Sie von Sekunden konvertieren (wie die ursprüngliche Frage formuliert wurde), möchten Sie möglicherweise timeRemaining mit 1000 multiplizieren.

Henrik Christensen
quelle
1

Ich bin auf den Fall gestoßen, in dem einige erwähnt haben, dass die Anzahl der Sekunden mehr als einen Tag beträgt. Hier ist eine angepasste Version von @Harish Anchus bestbewerteter Antwort, die längere Zeiträume berücksichtigt:

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

Beispiel:

secondsToTime(101596) // outputs '28:13:16' as opposed to '04:13:16'
ericgio
quelle
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;
}

Anwendungsbeispiel

alert("186".toHHMMSS());
Fouad Mekkey
quelle
1

Keine der Antworten hier entspricht meinen Anforderungen, da ich damit umgehen möchte

  1. Große Anzahl von Sekunden (Tagen) und
  2. Negative Zahlen

Obwohl diese vom OP nicht verlangt werden, empfiehlt es sich, Randfälle abzudecken, insbesondere wenn dies nur wenig Aufwand erfordert.

Es ist ziemlich offensichtlich, dass das OP eine ANZAHL von Sekunden bedeutet, wenn er Sekunden sagt . Warum sollten Sie Ihre Funktion festlegen 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
Duoc Tran
quelle
1
secondsToTimeSpan(8991)kehrt zurück, 6.00:05:51während ich denke, es sollte zurückkehren00:02:29:51
user1063287
0

Ich habe diesen Code bereits verwendet, um ein einfaches Zeitspannenobjekt zu erstellen:

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);
smack0007
quelle
1
Schleifenergebnisse sind eine sehr schlechte Codierungstechnik und sollten niemals verwendet werden. Sie beeinträchtigen Ihre Verarbeitungsleistung und geben Ihnen eine verzögerte Site
Yan Bellavance