427 Stimmen

JavaScript Sekunden in Zeitstring mit Format hh:mm:ss

Ich möchte eine Zeitspanne umwandeln, d.h., die Anzahl der Sekunden in einen durch Doppelpunkt getrennten Zeitstring (hh:mm:ss)

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

Gibt es also einen kleinen Ausschnitt, der dies in jQuery oder reinem JavaScript macht?

15 Stimmen

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

0 Stimmen

709voto

powtac Punkte 39079
String.prototype.toHHMMSS = function () {
    var sec_num = parseInt(this, 10); // denkt an den zweiten Parameter
    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;
}

Jetzt kannst du es verwenden wie:

alert("5678".toHHMMSS());

Arbeitsausschnitt:

String.prototype.toHHMMSS = function () {
    var sec_num = parseInt(this, 10); // denkt an den zweiten Parameter
    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;
}

console.log("5678".toHHMMSS());

1 Stimmen

Vielen Dank für die Prototyp-Idee, mir gefällt, wie es einfacher ist, sie zu nennen. Ich habe den Number prototypiert, sodass ich sie auch darauf aufrufen kann. Ich habe auch diese Antwort gefunden, die die Stunden und Minuten entfernen würde, wenn sie nicht benötigt werden.

1 Stimmen

Wow, das ist erstaunlich! Ich hasse es, mit der Zeit in JavaScript umzugehen.

0 Stimmen

Nur aus Neugier... irgendein bestimmter Grund, warum die Sekunden als Zeichenkette anstelle von Ganzzahlen übergeben werden?

381voto

Harish Ambady Punkte 10887

Sie können dies ohne externe JS-Bibliothek mit Hilfe der JS-Datumsmethode wie folgt verwalten:

var date = new Date(0);
date.setSeconds(45); // Wert für SEKUNDEN hier angeben
var timeString = date.toISOString().substring(11, 19);
console.log(timeString)

13 Stimmen

Warum ist diese Antwort so niedrig? Ich verstehe, dass es 2011 wahrscheinlich auf IE 7 und 8 basierte, die es nicht unterstützen würden, aber es ist Ende 2014, also sollte diese einfache, unkomplizierte Lösung viel höher sein.

2 Stimmen

Von MDN: Wenn ein von Ihnen spezifizierter Parameter außerhalb des erwarteten Bereichs liegt, versucht setSeconds(), die Datumsinformationen im Date-Objekt entsprechend zu aktualisieren. Wenn Sie z.B. 100 für secondsValue verwenden, werden die im Date-Objekt gespeicherten Minuten um 1 erhöht und 40 für Sekunden verwendet. Also ja, sieht gut aus!

75 Stimmen

Ich mag diese Antwort. Es kann sogar kürzer sein: new Date(1000 * sekunden).toISOString().substr(11, 8).

85voto

Raj Punkte 869

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

(Dies wurde weiter 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)

8 Stimmen

+1 - Super einfach; danke! Habe gerade eine Variante davon verwendet, um nur die Minuten und Sekunden anzuzeigen: var myDate = new Date().toTimeString().replace(/.*(\d{2}:\d{2})(:\d{2}).*/, "$1");

1 Stimmen

Sollte es nicht "new Date(null, null, null, null, null, timeInSecs).toTimeString().replace(/.*(\d{2}:)(\d{2}:\d{2}).‌​*/, "$2")" sein?

6 Stimmen

Die Verwendung von ersetzen ist verwirrend. Warum nicht new Date(null, null, null, null, null, timeInSeconds).toTimeString().match(/\d{2}:\d{2}:\d{2}/)[0] verwenden?

64voto

JellicleCat Punkte 26058

Ich empfehle gewöhnliches Javascript, das das Date-Objekt verwendet. (Für eine kürzere Lösung mit toTimeString siehe den zweiten Code-Schnipsel.)

var seconds = 9999;
// mit 1000 multiplizieren, da Date() Millisekunden erfordert
var date = new Date(seconds * 1000);
var hh = date.getUTCHours();
var mm = date.getUTCMinutes();
var ss = date.getSeconds();
// Wenn Sie einen Zeitstempel anstatt einer Dauer erstellen würden, würden Sie die folgende Zeile auskommentieren, um die 12-Stunden- (nicht 24-Stunden-) Zeit zu erhalten
// if (hh > 12) {hh = hh % 12;}
// Diese Zeilen stellen sicher, dass Sie zweistellige Zahlen haben
if (hh < 10) {hh = "0"+hh;}
if (mm < 10) {mm = "0"+mm;}
if (ss < 10) {ss = "0"+ss;}
// Dies formatiert Ihren String zu HH:MM:SS
var t = hh+":"+mm+":"+ss;
document.write(t);

(Natürlich wird das erstellte Date-Objekt ein tatsächliches Datum haben, aber diese Daten sind irrelevant, also brauchen Sie sich nicht darum zu kümmern.)


Bearbeiten (kurze Lösung):

Machen Sie Gebrauch von der toTimeString Funktion und teilen Sie am Leerzeichen auf:

var seconds = 9999; // Ein beliebiger Wert
var date = new Date(seconds * 1000); // mit 1000 multiplizieren, da Date() Millisekunden erfordert
var timeStr = date.toTimeString().split(' ')[0];

toTimeString gibt '16:54:58 GMT-0800 (PST)' zurück, und durch das Aufteilen am ersten Leerzeichen erhalten Sie '16:54:58'.

0 Stimmen

Es scheint das Datum in der lokalen Zeitzone festzulegen, was in meinem Fall 1 Stunde zur Zeit hinzufügt. Mit Sekunden = 0 bekomme ich "01:00:00" (Do 01 Jan 1970 01:00:00 GMT+0100 (CET)), was falsch ist.

3 Stimmen

Ich erhalte ein korrektes Ergebnis, wenn ich date.getUTCHours() und date.getUTCMinutes() verwende.

0 Stimmen

Ich verstehe nicht, warum du einen 12-Stunden-Zeitstempel zurückgibst, wenn er nach einer Dauer gefragt hat?

55voto

Tom Esterez Punkte 20809

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

0 Stimmen

Sie könnten dies so schreiben: 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(':');

3 Stimmen

@RubenStolk Ich finde es ein wenig verwirrend, eine Funktion zu haben, die zwei zweite Argumente annimmt. Ich finde meine Version klarer, auch wenn sie etwas ausführlicher ist.

0 Stimmen

Sekunden: Zahl Typ Annotationen, in ES6?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X