how can I sum hours:minutes:seconds in JavaScript.
I mean by
04:32:05
03:14:03
To get
07:46:08
Ive tried
var time1 = "01:00:01";
var time2 = "01:00:10";
var time3 = "01:54:00";
var time4 = "01:30:00";
var time5 = "01:00:00";
var time6 = "01:00:00";
var time7 = "01:00:00";
var hour=0;
var minute=0;
var second=0;
var splitTime1= time1.split(':');
var splitTime2= time2.split(':');
var splitTime3= time3.split(':');
var splitTime4= time4.split(':');
var splitTime5= time5.split(':');
var splitTime6= time6.split(':');
var splitTime7= time7.split(':');
hour = parseInt(splitTime1[0]) + parseInt(splitTime2[0]) + parseInt(splitTime3[0]) + parseInt(splitTime4[0]) + parseInt(splitTime5[0]) + parseInt(splitTime6[0]) + parseInt(splitTime7[0])
minute = parseInt(splitTime1[1]) + parseInt(splitTime2[1]) + parseInt(splitTime3[1]) + parseInt(splitTime4[1]) + parseInt(splitTime5[1]) + parseInt(splitTime6[1]) + parseInt(splitTime7[1])
hour = hour + minute/60;
minute = minute%60;
second = parseInt(splitTime1[2]) + parseInt(splitTime2[2]) + parseInt(splitTime3[2])
+ parseInt(splitTime4[2]) + parseInt(splitTime5[2]) + parseInt(splitTime6[2]) +
parseInt(splitTime7[2])
minute = minute + second/60;
second = second%60;
console.log(hour+ ":" + minute + ":"+ second)
The output I get is 8.4:24.183333333333334:11 instad of 08:24:11
any suggestions?
your making it very complex, you can reduce this by converting into Date objects and then add each date to get the sum of all dates
Understanding Date and Time in JavaScript
The problem with your code is you are including the decimal point
hour = hour + minute/60;
you need to floor it.
hour = hour + Math.floor(minute/60);
Now how to do it without a lot of repetitive code.
function toSeconds(s) {
const parts = s.split(':');
return +parts[0] * 3600 + +parts[1] * 60 + +parts[2];
}
function secondsToHHMMSS(secs) {
return Math.floor(secs / 3600).toString().padStart(2, '0') + ':' +
(Math.floor(secs / 60) % 60).toString().padStart(2, '0') + ':' +
(secs % 60).toString().padStart(2, '0');
}
const timestamps = ["01:00:01", "01:00:10", "01:54:00", "01:30:00", "01:00:00", "01:00:00", "01:00:00"];
const totalSeconds = timestamps.reduce(function(total, ts) {
return total + toSeconds(ts);
}, 0);
const result = secondsToHHMMSS(totalSeconds);
console.log(result);
If you want to sum of times then you should try this
var addTime = function (time1, time2) {
// convert to ms
var dateObject1 = new Date(time1).valueOf();
var dateObject2 = new Date(time2).valueOf();
return dateObject1 + dateObject2;
}
var time1 = new Date().setHours(4, 32, 5, 0);
var time2 = new Date().setHours(3, 14, 3, 0);
var sum = new Date(addTime(time1, time2));
var getFormatedTime = function (time) {
return time.getHours()+':'+time.getMinutes()+':'+time.getSeconds()
}
console.log(getFormatedTime(sum))
The first thing you should look into is using an Array, since you have a number of objects of the same kind.
You should ideally have something like,
const times = ["04:32:05", "03:14:03", ...]
Once you have that, this problem reduces to a classic use-case for the reduce function.
The reduce function operates on an array and accumulates the value of the operation every step to yield one value at the end.
Here's an example solution for your problem
const times = ["04:32:05", "03:14:03"]
//const times = ["01:00:01", "01:00:10","01:54:00","01:30:00"]
let finalSum = times.reduce((sum, curr) => {
//Obtain the current timestamp as an array of numbers
//[HRS, MINS, SECS]
let currTimeStamp = curr.split(":").map(token => parseInt(token));
//Add the current seconds to the total seconds so far
sum[2] += currTimeStamp[2];
//See how many minutes you got leftover as a result of that addition
const leftOverMins = Math.floor(sum[2] / 60);
//Mod by 60, to keep the seconds under 60
sum[2] %= 60;
//Add the leftover minutes to the sum operation for minutes
sum[1] += (currTimeStamp[1] + leftOverMins);
//Similar procedure as above
const leftOverHours = Math.floor(sum[1] / 60);
sum[1] %= 60;
sum[0] += (currTimeStamp[0] + leftOverHours);
sum[0] %= 24;
return sum
}, [0, 0, 0])
console.log(finalSum.join(":"))
Hello hope this answer will help you, I recommand to replace your bottom part (where you calculate) I do pretty much the same thing, but in the good order and with round to avoid decimals problems
var time1 = "01:00:01";
var time2 = "01:00:10";
var time3 = "01:54:00";
var time4 = "01:30:00";
var time5 = "01:00:00";
var time6 = "01:00:00";
var time7 = "01:00:00";
var hour=0;
var minute=0;
var second=0;
var splitTime1= time1.split(':');
var splitTime2= time2.split(':');
var splitTime3= time3.split(':');
var splitTime4= time4.split(':');
var splitTime5= time5.split(':');
var splitTime6= time6.split(':');
var splitTime7= time7.split(':');
var allTimes = [splitTime1, splitTime2, splitTime3, splitTime4, splitTime5, splitTime6, splitTime7]
allTimes.forEach(element => {
hour += parseInt(element[0])
minute += parseInt(element[1])
second += parseInt(element[2])
})
minute += Math.round(second / 60);
second = second % 60;
hour += Math.round(minute / 60);
minute = minute % 60
console.log(hour+ ":" + minute + ":"+ second)
I have time (string) in this format: 01:01:01:01 (hours/minutes/seconds/milliseconds).
And I need to parse this time to milliseconds (number), how I can do this?
Use the following code ........
var string = "01:01:01:01";
var string_array = string.split(":");
var hours = string_array[0];
var mins = string_array[1];
var seconds = string_array[2];
var miliseconds = string_array[3];
var total_miliseconds = (hours*60*60*1000) + (mins*60*1000) + (seconds*1000) + (miliseconds);
console.log ("Total Miliseconds: " + total_miliseconds);
You can use something like this:
function toMilisecond(time) {
[hours, mins, seconds, miliseconds] = time.split(":");
return hours * 3600000 + mins * 60000 + seconds * 1000 + Number(miliseconds);
}
console.log(toMilisecond("01:01:01:01"));
What the best way to convert the following starts playing time (1h20m25s) to second using javascript.
MODIFIED!
var hms = '1h20m00s',
H = hms.split('h')[0],
M = hms.substring(
hms.lastIndexOf("h") + 1,
hms.lastIndexOf("m")
),
S = hms.substring(
hms.lastIndexOf("m") + 1,
hms.lastIndexOf("s")
);
var spt = parseInt(H) * 60 * 60 + parseInt(M) * 60 + parseInt(S);
console.log(spt);
Not a clear question, hope this will help you :
// Assuming time is always in 99h99m99s format
var time = "1h20m25s";
// Extract hours
var h = parseInt(time.split("h")[0]);
var theRest = time.split("h")[1];
// Extract minutes
var m = parseInt(theRest.split("m")[0]);
// Extract seconds
var s = parseInt(theRest.split("m")[1]);
// Converting to seconds
var result = h*3600 + m*60 + s
document.write(time + ' in seconds : ' + result)
I have a string containing 13:00 , i have an duration of 90 for example and i have to convert the duration to hh:mm which i made it. Now i have a string with 1:30. How can i add this 1:30 string to the other 13:00 string so i can compare it with another strings? This is how i conver the duration
var bookH = Math.floor(data[0]['Duration'] / 60);
var bookM = data[0]['Duration'] % 60;
var bookingDurationToHour = bookH + ':' + bookM;
There is momentjs in the project but i still do not know how can i do that.
A solution with plain javascript.
var time = "13:00";
var totalInMinutes = (parseInt(time.split(":")[0]) * 60) + parseInt(time.split(":")[1]);
var otherMinutes = 90;
var grandTotal = otherMinutes + totalInMinutes;
//Now using your own code
var bookH = Math.floor(grandTotal / 60);
var bookM = grandTotal % 60;
var bookingDurationToHour = bookH + ':' + bookM;
alert(bookingDurationToHour);
Plunker
I've used Datejs before as vanilla JS with dates can be a bit difficult
First you want to put your time into a date time object
var myDate = Date.parse("2017-05-25 " + time);
Then you can add your time using the Datejs library:
myDate = myDate.addMinutes(90);
Then toString your new date as a time:
var newTime = myDate.toString("HH:MM");
<script>
function numeri_validator(t) {
var patt = /(\d*)\.{1}(\d{0,2})/;
var donepatt = /^(\d*)\.{1}(\d{2})$/;
var str = t.value;
var result;
if (!str.match(donepatt)) {
result = str.match(patt);
if (result != null) {
t.value = t.value.replace(/[^\d]/gi, '');
str = result[1] + '.' + result[2];
t.value = str;
} else {
if (t.value.match(/[^\d]/gi))
t.value = t.value.replace(/[^\d]/gi, '');
}
}
//get the date
var val1 = document.getElementById("cost" + 1).value;
var val2 = document.getElementById("cost" + 2).value;
//Get date
var date = document.getElementById("Label1").innerText;
//format time
var timeIn = val1.replace('.', ':');
var timeOut = val2.replace('.', ':');
//Concat time with date
var timeinDate = date + " " + timeIn;
var timeoutDate = date + " " + timeOut;
//calculate time difference
var nDifference = Math.abs(new Date(timeoutDate) - new Date(timeinDate));
var one_hours = 1000 * 60 * 60;
var hours = (Math.floor(nDifference / one_hours));
var diff = nDifference % one_hours;
var one_min = 1000 * 60;
var diffmin = Math.round(diff / one_min);
document.getElementById("datelabel").innerText = hours + "." + diffmin;
document.getElementById("total").value = hours + "." + diffmin;
This function calculating the difference between the two times is working fine but is working only in Chrome in other browsers is:
document.getElementById("total").value=NaN:NaN
Please help me.
The issue should be because of this part in your code. .innerText.
var date = document.getElementById("Label1").innerText;
.innerText doesn't work in Mozilla. Use .textContent instead
var date = document.getElementById("Label1").textContent;
I solved this problem by changing the date format. Actually this problem with new Date()
The new Date format should be
new Date('2013/10/19 12:00') // not 2013-10-19
Now is working on all browsers
Thanks