Pregunta

¿Cómo puedo convertir segundos a un HH-MM-SS cadena usando JavaScript?

¿Fue útil?

Solución

¿No sabes Datejs ? es un debe saber.

El uso de Datejs, acaba de escribir algo como:

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

- Actualización

Hoy en día date.js es obsoleto y no se mantiene, a fin de utilizar " Moment.js ", que es mucho mejor como puntas por TJ Crowder.

Otros consejos

Puede llegar a hacer esto sin ninguna biblioteca de JavaScript externo con la ayuda de JavaScript método de la fecha como el siguiente:

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

O, como por @Frank 's comentario; un un trazador de líneas:

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

No creo que ninguna característica integrada del objeto Date norma lo hará por usted de una manera que es más conveniente que limitarse a hacer sus propios cálculos.

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

Ejemplo:

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

Sé que esto es un poco viejo, pero ...

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

seria:

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

Como Cleiton señaló en su respuesta , moment.js se puede utilizar para esto:

moment().startOf('day')
        .seconds(15457)
        .format('H:mm:ss');
function formatSeconds(seconds)
{
    var date = new Date(1970,0,1);
    date.setSeconds(seconds);
    return date.toTimeString().replace(/.*(\d{2}:\d{2}:\d{2}).*/, "$1");
}

Este es el truco:

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

(Procedente de rel="noreferrer"> )

Prueba esto:

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

Esta es una extensión de la clase Número. toHHMMSS () convierte segundos a una hh: cadena ss: mm.

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>

Fácil de seguir la versión de 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);

Esta función debe hacerlo:

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

Sin pasar un separador, que utiliza : como el separador (predeterminado):

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

Si desea utilizar - como separador, sólo tiene que pasar como el segundo parámetro:

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

esta violín .

Sólo quería dar una pequeña explicación de la respuesta agradable arriba:

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

En la segunda línea, ya que hay 3.600 segundos en 1 hora, se divide el número total de segundos por 3600 para obtener el número total de horas. Utilizamos parseInt de quitarse cualquier decimal. Si era totalSec 12600 (3 horas y media), a continuación, parseInt (totalSec / 3600) volvería 3, ya que tendremos 3 horas completas. ¿Por qué necesitamos el 24% en este caso? Si excedemos 24 horas, supongamos que tenemos 25 horas (90000 segundos), entonces el módulo aquí nos llevará de nuevo a 1 de nuevo, en lugar de volver 25. Se confinar el resultado dentro de un límite de 24 horas, ya que hay 24 horas En un día.

Cuando vea algo como esto:

25 % 24

Piense en ello como esto:

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

Chiming en este hilo de edad - el PO declaró HH: MM: SS, y muchas de las soluciones funciona, hasta que se da cuenta de que necesita más de 24 horas que se indican. Y tal vez no desea más que una sola línea de código. Aquí van:

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

Devuelve H +: MM: SS. Para usarlo, basta con utilizar:

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

... Traté de conseguir que se utilice la menor cantidad de código posible, para un buen enfoque de una sola línea.

a continuación es el código dado que convertirá segundos en formato hh-mm-ss:

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

Obtener método alternativo de Convertir segundos a formato HH-MM-SS en JavaScript

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

¿Usted ha intentado añadir segundos para un objeto Date?

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

Una muestra: https://jsfiddle.net/j5g2p0dc/5/

Actualizado: El enlace de ejemplo faltaba así que creé una nueva.

He aquí una función para convertir segundos a formato hh-mm-ss basado en la respuesta de powtac aquí

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

Ejemplo usar

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

Después de mirar todas las respuestas y no ser feliz con la mayoría de ellos, esto es lo que ocurrió. Sé que soy muy tarde a la conversación, pero aquí está de todos modos.

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

se crea un nuevo objeto Date, cambiar el tiempo para mis parámetros, convertir la fecha del objeto a una cadena de tiempo, y se retira el material adicional mediante el fraccionamiento de la cadena y devolver sólo la parte que necesita.

pensé que iba a compartir este enfoque, ya que elimina la necesidad de expresiones regulares, la lógica y las matemáticas acrobacias para obtener los resultados en "hh: mm: ss" formato, y en su lugar se basa en construido en métodos

.

Es posible que desee echar un vistazo a la documentación aquí: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date

Hay muchas opciones para resolver este problema y, obviamente, se sugieren buenas opciones, pero quiero agregar un código optimizado más aquí.

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

Si no desea formatear cero con menos de 10 números, puede usar

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

}

Código de muestra http://fiddly.org/1c476/1

En una línea, usando T.J. La solución de Crowder:

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

En una línea, otra solución que también cuentan días:

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

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

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

También puede utilizar a continuación código:

int ss = nDur%60;
nDur   = nDur/60;
int mm = nDur%60;
int hh = nDur/60;

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

Resultado de 15:08:03

Para cualquier persona usando AngularJS, una solución simple es filtrar el valor con la fecha API , que convierte milisegundos a una cadena basado en el formato solicitado. Ejemplo:

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

Tenga en cuenta que esta espera milisegundos, por lo que puede multiplicar por 1,000 timeRemaining si va a convertir desde segundos (como la pregunta original fue formulada).

Me encontré con el caso algunos han mencionado, donde el número de segundos es más de un día. Aquí está una versión adaptada de respuesta más altas calificaciones de @Harish Anchu que da cuenta de los períodos más largos de tiempo:

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

Ejemplo:

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

Uso Ejemplo

alert("186".toHHMMSS());

Ninguna de las respuestas aquí satisface mis necesidades como yo quiero ser capaz de manejar

  1. Un gran número de segundos (día), y
  2. Los números negativos

A pesar de que los que no son requeridos por el PO, es una buena práctica para cubrir casos extremos, sobre todo cuando se necesita poco esfuerzo.

Es bastante obvio es que el PO significa un número de segundos cuando dice segundo . ¿Por qué le peg su función en 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

He utilizado este código antes de crear un objeto lapso de tiempo simple:

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

Tal vez algo como esto:

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);
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top