Soundcloud's API gives the duration of it's tracks as milliseconds. JSON looks like this:
"duration": 298999
I've tried many functions I found on here to no avail. I'm just looking for something to convert that number to something like looks like this:
4:59
Here's one that got close, but doesn't work. It doesn't stop the seconds at 60. It goes all the way to 99 which makes no sense. Try entering "187810" as a value of ms, for example.
var ms = 298999,
min = Math.floor((ms/1000/60) << 0),
sec = Math.floor((ms/1000) % 60);
console.log(min + ':' + sec);
Thanks for your help!
If you could add in support for hours, too, I would be grateful.
function millisToMinutesAndSeconds(millis) {
var minutes = Math.floor(millis / 60000);
var seconds = ((millis % 60000) / 1000).toFixed(0);
return minutes + ":" + (seconds < 10 ? '0' : '') + seconds;
}
millisToMinutesAndSeconds(298999); // "4:59"
millisToMinutesAndSeconds(60999); // "1:01"
As User HelpingHand
pointed in the comments the return statement should be
return (seconds == 60 ? (minutes+1) + ":00" : minutes + ":" + (seconds < 10 ? "0" : "") + seconds);
var ms = 298999;
ms = 1000*Math.round(ms/1000); // round to nearest second
var d = new Date(ms);
console.log( d.getUTCMinutes() + ':' + d.getUTCSeconds() ); // "4:59"
Also if you want the hours, use d.getUTCHours()
.
There is probably a better way to do this, but it gets the job done:
var ms = 298999;
var min = ms / 1000 / 60;
var r = min % 1;
var sec = Math.floor(r * 60);
if (sec < 10) {
sec = '0'+sec;
}
min = Math.floor(min);
console.log(min+':'+sec);
Not sure why you have the << operator in your minutes line, I don't think it's needed just floor the minutes before you display.
Getting the remainder of the minutes with % gives you the percentage of seconds elapsed in that minute, so multiplying it by 60 gives you the amount of seconds and flooring it makes it more fit for display although you could also get sub-second precision if you want.
If seconds are less than 10 you want to display them with a leading zero.
Event though ,oment.js does not provide such functionality, if you come here and you are already using moment.js, try this:
function formatDuration(ms) {
var duration = moment.duration(ms);
return Math.floor(duration.asHours()) + moment.utc(duration.asMilliseconds()).format(":mm:ss");
}
You will get something like x:xx:xx.
In the case you may want to skip the hour, when the duration is only < 60minutes.
function formatDuration(ms) {
var duration = moment.duration(ms);
if (duration.asHours() > 1) {
return Math.floor(duration.asHours()) + moment.utc(duration.asMilliseconds()).format(":mm:ss");
} else {
return moment.utc(duration.asMilliseconds()).format("mm:ss");
}
}
This workaround in moment was introduced in this Issue.
Here's my contribution if looking for
h:mm:ss
instead like I was:
function msConversion(millis) {
let sec = Math.floor(millis / 1000);
let hrs = Math.floor(sec / 3600);
sec -= hrs * 3600;
let min = Math.floor(sec / 60);
sec -= min * 60;
sec = '' + sec;
sec = ('00' + sec).substring(sec.length);
if (hrs > 0) {
min = '' + min;
min = ('00' + min).substring(min.length);
return hrs + ":" + min + ":" + sec;
}
else {
return min + ":" + sec;
}
}
Best is this!
function msToTime(duration) {
var milliseconds = parseInt((duration%1000))
, seconds = parseInt((duration/1000)%60)
, minutes = parseInt((duration/(1000*60))%60)
, hours = parseInt((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;
}
It will return 00:04:21.223 You can format this string then as you wish.
this code will do a better job if you want to show hours, and centiseconds or miliseconds after seconds like 1:02:32.21 and if used in a cell phone the timer will show correct timing even after screen lock.
<div id="timer" style="font-family:monospace;">00:00<small>.00</small></div>
<script>
var d = new Date();
var n = d.getTime();
var startTime = n;
var tm=0;
function updateTimer(){
d = new Date();
n = d.getTime();
var currentTime = n;
tm = (currentTime-startTime);
//tm +=1;
// si el timer cuenta en centesimas de segundo
//tm = tm*10;
var hours = Math.floor(tm / 1000 / 60 / 60);
var minutes = Math.floor(tm / 60000) % 60;
var seconds = ((tm / 1000) % 60);
// saca los decimales ej 2 d{0,2}
var seconds = seconds.toString().match(/^-?\d+(?:\.\d{0,-1})?/)[0];
var miliseconds = ("00" + tm).slice(-3);
var centiseconds;
// si el timer cuenta en centesimas de segundo
//tm = tm/10;
centiseconds = miliseconds/10;
centiseconds = (centiseconds).toString().match(/^-?\d+(?:\.\d{0,-1})?/)[0];
minutes = (minutes < 10 ? '0' : '') + minutes;
seconds = (seconds < 10 ? '0' : '') + seconds;
centiseconds = (centiseconds < 10 ? '0' : '') + centiseconds;
hours = hours + (hours > 0 ? ':' : '');
if (hours==0){
hours='';
}
document.getElementById("timer").innerHTML = hours + minutes + ':' + seconds + '<small>.' + centiseconds + '</small>';
}
var timerInterval = setInterval(updateTimer, 10);
// clearInterval(timerInterval);
</script>
来源:https://stackoverflow.com/questions/21294302/converting-milliseconds-to-minutes-and-seconds-with-javascript