¿Cómo convertir milisegundos de tiempo a formato de horas, minutos y segundos en JavaScript?

86

Tengo el tiempo en milisegundos, pero quiero el tiempo después de la conversión como 00:00:00.

Ej: en milisegundos = 86400000. Quiero cuántas horas en milisegundos como,00:00:00

¿Cómo conseguirlo en JavaScript?

cheliyan
fuente

Respuestas:

122

¿Qué tal hacer esto creando una función en javascript como se muestra a continuación?

function msToTime(duration) {
  var milliseconds = parseInt((duration % 1000) / 100),
    seconds = Math.floor((duration / 1000) % 60),
    minutes = Math.floor((duration / (1000 * 60)) % 60),
    hours = Math.floor((duration / (1000 * 60 * 60)) % 24);

  hours = (hours < 10) ? "0" + hours : hours;
  minutes = (minutes < 10) ? "0" + minutes : minutes;
  seconds = (seconds < 10) ? "0" + seconds : seconds;

  return hours + ":" + minutes + ":" + seconds + "." + milliseconds;
}
console.log(msToTime(300000))

Dusht
fuente
He usado esta forma para convertir milisegundos en formato de horas: minutos: segundos. Pero no lo obtuve correctamente. Solo da 21:11:05 para todos los milisegundos. ¿Cómo puedo implementar esto?
Cheliyan
1
var s = st_date + '' + inicio; var e = fecha_final + '' + fin; var bits = s.split (/ \ D /); var bits1 = e.split (/ \ D /); var fecha = nueva fecha (bits [0], - bits [1], bits [2], bits [3], bits [4], bits [5]); var date1 = nueva fecha (bits1 [0], - bits1 [1], bits1 [2], bits1 [3], bits1 [4], bits1 [5]);
Cheliyan
var t1 = date.getTime () var t2 = date1.getTime () var t3 = date1.getTime () - date.getTime (); var segundos; var minutos; var milisegundos = parseInt ((t3% 1000) / 100), segundos = parseInt ((t3 / 1000)% 60), minutos = parseInt ((t3 / (1000 * 60))% 60), horas = parseInt ((t3 / (1000 * 60 * 60))% 24); horas = (horas <10)? "0" + horas: horas; minutos = (minutos <10)? "0" + minutos: minutos; segundos = (segundos <10)? "0" + segundos: segundos; duración = horas + ":" + minutos + ":" + segundos; alerta ('dur ::' + t3); alerta ('duración:' + duración);
Cheliyan
6
parseInt (cadena) no es la forma óptima de piso. Por ejemplo, no puede usarlo en mecanografiado. Además, ¿por qué ms / 100? Esta no es una buena respuesta en absoluto.
Dominik
1
jsperf.com/test-parseint-and-math-floor Floor es mucho más rápido que ParseInt
Matthieu Riegler
53

Convertir el tiempo en milisegundos a un formato legible por humanos.

 function timeConversion(millisec) {

        var seconds = (millisec / 1000).toFixed(1);

        var minutes = (millisec / (1000 * 60)).toFixed(1);

        var hours = (millisec / (1000 * 60 * 60)).toFixed(1);

        var days = (millisec / (1000 * 60 * 60 * 24)).toFixed(1);

        if (seconds < 60) {
            return seconds + " Sec";
        } else if (minutes < 60) {
            return minutes + " Min";
        } else if (hours < 24) {
            return hours + " Hrs";
        } else {
            return days + " Days"
        }
    }

"Muestra de salida"

Nofi
fuente
4
Encontré este el más útil, la respuesta principal no pareció manejar las horas muy bien en mis pruebas y esto también te da las opciones de días.
ak85
21

Tuve el mismo problema, esto es lo que terminé haciendo:

function parseMillisecondsIntoReadableTime(milliseconds){
  //Get hours from milliseconds
  var hours = milliseconds / (1000*60*60);
  var absoluteHours = Math.floor(hours);
  var h = absoluteHours > 9 ? absoluteHours : '0' + absoluteHours;

  //Get remainder from hours and convert to minutes
  var minutes = (hours - absoluteHours) * 60;
  var absoluteMinutes = Math.floor(minutes);
  var m = absoluteMinutes > 9 ? absoluteMinutes : '0' +  absoluteMinutes;

  //Get remainder from minutes and convert to seconds
  var seconds = (minutes - absoluteMinutes) * 60;
  var absoluteSeconds = Math.floor(seconds);
  var s = absoluteSeconds > 9 ? absoluteSeconds : '0' + absoluteSeconds;


  return h + ':' + m + ':' + s;
}


var time = parseMillisecondsIntoReadableTime(86400000);

alert(time);

xno
fuente
17

Este vuelve el tiempo como videos de youtube

    function getYoutubeLikeToDisplay(millisec) {
        var seconds = (millisec / 1000).toFixed(0);
        var minutes = Math.floor(seconds / 60);
        var hours = "";
        if (minutes > 59) {
            hours = Math.floor(minutes / 60);
            hours = (hours >= 10) ? hours : "0" + hours;
            minutes = minutes - (hours * 60);
            minutes = (minutes >= 10) ? minutes : "0" + minutes;
        }

        seconds = Math.floor(seconds % 60);
        seconds = (seconds >= 10) ? seconds : "0" + seconds;
        if (hours != "") {
            return hours + ":" + minutes + ":" + seconds;
        }
        return minutes + ":" + seconds;
    }

Salida:

  • getYoutubeLikeToDisplay (129900) = "2:10"
  • getYoutubeLikeToDisplay (1229900) = "20:30"
  • getYoutubeLikeToDisplay (21229900) = "05:53:50"
Chand
fuente
comentario: no funciona correctamente durante el tiempo negativo, por ejemplo, -3000debería mostrarse -00:03pero regresa -1:0-03.
anu
16

Aqui esta mi solucion

let h,m,s;
h = Math.floor(timeInMiliseconds/1000/60/60);
m = Math.floor((timeInMiliseconds/1000/60/60 - h)*60);
s = Math.floor(((timeInMiliseconds/1000/60/60 - h)*60 - m)*60);

// para obtener el formato de hora 00:00:00

s < 10 ? s = `0${s}`: s = `${s}`
m < 10 ? m = `0${m}`: m = `${m}`
h < 10 ? h = `0${h}`: h = `${h}`


console.log(`${s}:${m}:${h}`);
Tin Pritišanac
fuente
MARAVILLOSO. Gracias.
Andy
Respuesta más limpia a esta pregunta.
muad-dweeb
2
Establecería un valor en s fuera del operador ternario:s = `${s < 10 ? '0': ''}${s}`
seniorpreacher
9

Lo siento, llego tarde a la fiesta. La respuesta aceptada no fue suficiente para mí, así que la escribí yo mismo.

Salida:

2h 59s
1h 59m
1h
1h 59s
59m 59s
59s

Código (mecanografiado):

function timeConversion(duration: number) {
  const portions: string[] = [];

  const msInHour = 1000 * 60 * 60;
  const hours = Math.trunc(duration / msInHour);
  if (hours > 0) {
    portions.push(hours + 'h');
    duration = duration - (hours * msInHour);
  }

  const msInMinute = 1000 * 60;
  const minutes = Math.trunc(duration / msInMinute);
  if (minutes > 0) {
    portions.push(minutes + 'm');
    duration = duration - (minutes * msInMinute);
  }

  const seconds = Math.trunc(duration / 1000);
  if (seconds > 0) {
    portions.push(seconds + 's');
  }

  return portions.join(' ');
}

console.log(timeConversion((60 * 60 * 1000) + (59 * 60 * 1000) + (59 * 1000)));
console.log(timeConversion((60 * 60 * 1000) + (59 * 60 * 1000)              ));
console.log(timeConversion((60 * 60 * 1000)                                 ));
console.log(timeConversion((60 * 60 * 1000)                    + (59 * 1000)));
console.log(timeConversion(                   (59 * 60 * 1000) + (59 * 1000)));
console.log(timeConversion(                                      (59 * 1000)));
anonimito
fuente
Gracias hombre, esto es lo que quería. Tuve que adaptarme ligeramente para mostrar '0h 0m 10s', etc. pero por lo demás limpio y simple
HazeyAce
Comencé a escribir el mío, luego pensé, alguien ya debe haber hecho esto :). ¡Gracias!
Ben S
6

Los fragmentos anteriores no funcionan para casos con más de 1 día (simplemente se ignoran).

Para esto puedes usar:

function convertMS(ms) {
    var d, h, m, s;
    s = Math.floor(ms / 1000);
    m = Math.floor(s / 60);
    s = s % 60;
    h = Math.floor(m / 60);
    m = m % 60;
    d = Math.floor(h / 24);
    h = h % 24;
    h += d * 24;
    return h + ':' + m + ':' + s;
}

ingrese la descripción de la imagen aquí

Gracias a https://gist.github.com/remino/1563878

Frank Adrian
fuente
1
Para tener una salida más humanizada, puede devolver algo como: return ((h + '') .length === 1? '0' + h: h) + ':' + ('0' + m) .substr (- 2) + ':' + ('0' + s) .substr (-2);
Vitall
@Vitall Solo usa return (h < 10 ? "0" + h : h) + ":" + (m < 10 ? "0" + m : m) + ":" + (s < 10 ? "0" + s : s);, porque es mucho mejor hacer esto con matemáticas que con un montón de manipulación de cadenas.
Mitch McMabers
3

Necesitaba tiempo solo hasta un día, 24 horas, esta fue mi opinión:

const milliseconds = 5680000;

const hours = `0${new Date(milliseconds).getHours() - 1}`.slice(-2);
const minutes = `0${new Date(milliseconds).getMinutes()}`.slice(-2);
const seconds = `0${new Date(milliseconds).getSeconds()}`.slice(-2);

const time = `${hours}:${minutes}:${seconds}`
console.log(time);

también podría obtener días de esta manera si es necesario.

Goran Jakovljevic
fuente
3

Esta solución usa uno functionpara dividir milisegundos en a parts object, y otro functionpara formatear parts object.

Creé 2 funciones de formato, una como lo solicitaste y otra que imprime una cadena amigable y considerando singular / plural, e incluye una opción para mostrar milisegundos.

function parseDuration(duration) {
  let remain = duration

  let days = Math.floor(remain / (1000 * 60 * 60 * 24))
  remain = remain % (1000 * 60 * 60 * 24)

  let hours = Math.floor(remain / (1000 * 60 * 60))
  remain = remain % (1000 * 60 * 60)

  let minutes = Math.floor(remain / (1000 * 60))
  remain = remain % (1000 * 60)

  let seconds = Math.floor(remain / (1000))
  remain = remain % (1000)

  let milliseconds = remain

  return {
    days,
    hours,
    minutes,
    seconds,
    milliseconds
  };
}

function formatTime(o, useMilli = false) {
  let parts = []
  if (o.days) {
    let ret = o.days + ' day'
    if (o.days !== 1) {
      ret += 's'
    }
    parts.push(ret)
  }
  if (o.hours) {
    let ret = o.hours + ' hour'
    if (o.hours !== 1) {
      ret += 's'
    }
    parts.push(ret)
  }
  if (o.minutes) {
    let ret = o.minutes + ' minute'
    if (o.minutes !== 1) {
      ret += 's'
    }
    parts.push(ret)

  }
  if (o.seconds) {
    let ret = o.seconds + ' second'
    if (o.seconds !== 1) {
      ret += 's'
    }
    parts.push(ret)
  }
  if (useMilli && o.milliseconds) {
    let ret = o.milliseconds + ' millisecond'
    if (o.milliseconds !== 1) {
      ret += 's'
    }
    parts.push(ret)
  }
  if (parts.length === 0) {
    return 'instantly'
  } else {
    return parts.join(' ')
  }
}

function formatTimeHMS(o) {
  let hours = o.hours.toString()
  if (hours.length === 1) hours = '0' + hours

  let minutes = o.minutes.toString()
  if (minutes.length === 1) minutes = '0' + minutes

  let seconds = o.seconds.toString()
  if (seconds.length === 1) seconds = '0' + seconds

  return hours + ":" + minutes + ":" + seconds
}

function formatDurationHMS(duration) {
  let time = parseDuration(duration)
  return formatTimeHMS(time)
}

function formatDuration(duration, useMilli = false) {
  let time = parseDuration(duration)
  return formatTime(time, useMilli)
}


console.log(formatDurationHMS(57742343234))

console.log(formatDuration(57742343234))
console.log(formatDuration(5423401000))
console.log(formatDuration(500))
console.log(formatDuration(500, true))
console.log(formatDuration(1000 * 30))
console.log(formatDuration(1000 * 60 * 30))
console.log(formatDuration(1000 * 60 * 60 * 12))
console.log(formatDuration(1000 * 60 * 60 * 1))

Steven Spungin
fuente
3

Código legible por humanos para salida legible por humanos y puede extender esto a años luz o nanosegundos o lo que sea de manera muy intuitiva. Obviamente, querrá convertir esto en una función y reutilizar algunas de esas llamadas de módulo intermedio.

second = 1000 
minute = second * 60
hour = minute * 60 
day = hour * 24

test = 3 * day + 2 * hour + 11 * minute + 58 * second

console.log(Math.floor(test / day))
console.log(Math.floor(test % day / hour))
console.log(Math.floor(test % day % hour / minute))
console.log(Math.floor(test % day % hour % minute / second))
Rick O'Shea
fuente
2

Basado en la respuesta de @Chand. Esta es la implementación en TypeScript. Un poco más seguro que los tipos coercitivos en JS. Si elimina el tipo, la anotación debe ser JS válida. También usando nuevas funciones de cadena para normalizar el tiempo.

function displayTime(millisec: number) {
 const normalizeTime = (time: string): string => (time.length === 1) ? time.padStart(2, '0') : time;

 let seconds: string = (millisec / 1000).toFixed(0);
 let minutes: string = Math.floor(parseInt(seconds) / 60).toString();
 let hours: string = '';

 if (parseInt(minutes) > 59) {
   hours = normalizeTime(Math.floor(parseInt(minutes) / 60).toString());
   minutes = normalizeTime((parseInt(minutes) - (parseInt(hours) * 60)).toString());
 }
 seconds = normalizeTime(Math.floor(parseInt(seconds) % 60).toString());

 if (hours !== '') {
    return `${hours}:${minutes}:${seconds}`;
 }
   return `${minutes}:${seconds}`;
}
KevinOrfas
fuente
1
Alguien podría encontrarlo útil.
KevinOrfas
1
JS está evolucionando hacia TypeScript. Esto probablemente será JS válido pronto. :-)
N8allan
2

Trabajó para mi

msToTime(milliseconds) {
    //Get hours from milliseconds
    var hours = milliseconds / (1000*60*60);
    var absoluteHours = Math.floor(hours);
    var h = absoluteHours > 9 ? absoluteHours : '0' + absoluteHours;

    //Get remainder from hours and convert to minutes
    var minutes = (hours - absoluteHours) * 60;
    var absoluteMinutes = Math.floor(minutes);
    var m = absoluteMinutes > 9 ? absoluteMinutes : '0' +  absoluteMinutes;

    //Get remainder from minutes and convert to seconds
    var seconds = (minutes - absoluteMinutes) * 60;
    var absoluteSeconds = Math.floor(seconds);
    var s = absoluteSeconds > 9 ? absoluteSeconds : '0' + absoluteSeconds;

    return h == "00" ? m + ':' + s : h + ':' + m + ':' + s;
}
Hassan
fuente
1

mi solución

var sunriseMills = 1517573074000;         // sunrise in NewYork on Feb 3, 2018  - UTC time
var offsetCityMills = -5 * 3600 * 1000;   // NewYork delay to UTC 
var offsetDeviceMills =  new Date().getTimezoneOffset() * 60 * 1000 ;  // eg. I live in Romania (UTC+2) >> getTimezoneOffset() = 120

var textTime = new Date(sunriseMills + offsetCityMills + offsetDeviceMills) 
    .toLocaleTimeString('en-US', { hour: 'numeric', minute: 'numeric' });

textTime se convertirá en ' 7.04 AM '

Dan Alboteanu
fuente
1

Ampliando la respuesta de @ Rick, prefiero algo como esto:

function msToReadableTime(time){
  const second = 1000;
  const minute = second * 60;
  const hour = minute * 60;

  let hours = Math.floor(time / hour % 24);
  let minutes = Math.floor(time / minute % 60);
  let seconds = Math.floor(time / second % 60);
 

  return hours + ':' + minutes + ":" + seconds;
}
Mustapha-Belkacim
fuente
0

Si está usando mecanografiado, esto podría ser bueno para usted

enum ETime {
  Seconds = 1000,
  Minutes = 60000,
  Hours = 3600000,
  SecInMin = 60,
  MinInHours = 60,
  HoursMod = 24,
  timeMin = 10,
}

interface ITime {
  millis: number
  modulo: number
}

const Times = {
  seconds: {
    millis: ETime.Seconds,
    modulo: ETime.SecInMin,
  },
  minutes: {
    millis: ETime.Minutes,
    modulo: ETime.MinInHours,
  },
  hours: {
    millis: ETime.Hours,
    modulo: ETime.HoursMod,
  },
}

const dots: string = ":"

const msToTime = (duration: number, needHours: boolean = true): string => {
  const getCorrectTime = (divider: ITime): string => {
    const timeStr: number = Math.floor(
      (duration / divider.millis) % divider.modulo,
    )

    return timeStr < ETime.timeMin ? "0" + timeStr : String(timeStr)
  }

  return (
    (needHours ? getCorrectTime(Times.hours) + dots : "") +
    getCorrectTime(Times.minutes) +
    dots +
    getCorrectTime(Times.seconds)
  )
}
Jonathan Biteau
fuente
0

En mi implementación usé Moment.js:

export default (value) => 
  const duration = moment.duration(value);

  const milliseconds = duration.milliseconds();
  const seconds = duration.seconds();
  const minutes = duration.minutes();
  const hours = duration.hours();
  const day = duration.days();

  const sDay = `${day}d `;
  const sHours = (hours < 10) ? `0${hours}h ` : `${hours}h `;
  const sMinutes = (minutes < 10) ? `0${minutes}' ` : `${minutes}' `;
  const sSeconds = (seconds < 10) ? `0${seconds}" ` : `${seconds}" `;
  const sMilliseconds = `${milliseconds}ms`;

  ...
}

Una vez que obtuve las cuerdas, las compuse como quisiera.

lucataglia
fuente
0

Me funciona porque obtengo milisegundos = 1592380675409 usando el método javascript getTime () que devuelve el número de milisegundos entre la medianoche del 1 de enero de 1970 y la fecha especificada.

var d = new Date();//Wed Jun 17 2020 13:27:55 GMT+0530 (India Standard Time)
var n = d.getTime();//1592380675409 this value is store somewhere

//function call 
console.log(convertMillisecToHrMinSec(1592380675409));

var convertMillisecToHrMinSec = (time) => {
  let date = new Date(time);
  let hr = date.getHours();
  let min = date.getMinutes();
  let sec = date.getSeconds();

  hr = (hr < 10) ? "0"+ hr : hr;
  min = (min < 10) ? "0"+ min : min;
  sec = (sec < 10) ? "0"+ sec : sec;

  return hr + ':' + min + ":" + sec;//01:27:55
}
Sneha Morye
fuente
Explique su código, el código sin explicación es un código incorrecto.
Islam Elshobokshy
Gracias por la sugerencia, definitivamente explico mi solución
Sneha Morye