在Javascript中以毫秒计算时间差



我想找到Javascript中毫秒值的两个时间之间的差异。如下图所示,我在Excel中计算了两个时间值。我的期望完全相同的计算值与JS代码。我尝试了一些代码片段,但我在几秒钟内略有不同。

<!DOCTYPE html>
<html>
<body>

<h2>JavaScript new Date()</h2>

<p>new Date() creates a new date object with the current date and time:</p>

<p id="demo"></p>

<script>
var d1 = '2020-12-15 01:00:23.788';
var d2 = '2020-12-15 01:00:55.482';
var date1 = new Date(d1);
var date2 = new Date(d2);
//date2 += 500;
//date2 = new Date(date2);
//date2.setMilliseconds(5);
var date1_ms = date1.getTime();
var date2_ms = date2.getTime();
// Calculate the difference in milliseconds
var difference_ms = date2_ms - date1_ms;
//take out milliseconds
difference_ms = difference_ms/1000;
var seconds = Math.floor(difference_ms % 60);
difference_ms = difference_ms/60; 
var minutes = Math.floor(difference_ms % 60);
difference_ms = difference_ms/60; 
var hours = Math.floor(difference_ms % 24);  

var demo =  hours + ' hours, ' + minutes + ' minutes, and ' + seconds + ' seconds.' + difference_ms;
document.getElementById("demo").innerHTML = demo;
</script>

</body>
</html>

你用毫秒计算小时、分钟和秒的算法是有缺陷的。在除之前,您必须从差中减去结果,而不是将模数运算的结果加成。因为如果这样,差别只显示31秒,尽管差别更大。查看下面的正确算法:

var d1 = "2020-12-15 01:00:23.788";
var d2 = "2020-12-15 01:00:55.482";
var date1 = new Date(d1);
var date2 = new Date(d2);
var date1_ms = date1.getTime();
var date2_ms = date2.getTime();
var difference_ms = date2_ms - date1_ms;
var milliseconds = difference_ms % 1000; // milliseconds that are less than one second
difference_ms = (difference_ms - milliseconds) / 1000; // convert to seconds
var seconds = difference_ms % 60; // seconds that are less than one minute
difference_ms = (difference_ms - seconds) / 60; // convert to minutes
var minutes = difference_ms % 60; // minutes that are less than one hour
difference_ms = (difference_ms - minutes) / 60; // convert to hours
var hours = difference_ms % 24;
document.getElementById("output").innerHTML = hours + "h " + minutes + "m " + seconds + "s " + milliseconds + "ms";
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>

<body>
<p id="output"></p>
</body>
</html>

你已经问过这个问题了。如果这是相同的问题,那么以下是代码。

function splitInNumberArray(str) {
return str
.replace(/(:|.)/g, " ")
.split(" ")
.map((x) => parseInt(x));
}
function convertToMilliseconds(timeArray) {
return (
timeArray[0] * 60 * 60 * 1000 +
timeArray[1] * 60 * 1000 +
timeArray[2] * 1000 +
timeArray[3]
);
}
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;
}
// This function is taken from https://stackoverflow.com/questions/19700283/how-to-convert-time-milliseconds-to-hours-min-sec-format-in-javascript
function parseDuration(duration) {
let remain = duration;
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 {
hours,
minutes,
seconds,
milliseconds,
};
}
function minTwoDigits(n) {
return (n < 10 ? "0" : "") + n;
}
//********************************
const time1 = "01:00:55.482";
const time2 = "01:00:23.788";
const numberArray1 = splitInNumberArray(time1);
const numberArray2 = splitInNumberArray(time2);
const msTime1 = convertToMilliseconds(numberArray1);
const msTime2 = convertToMilliseconds(numberArray2);
const diff = msTime1 - msTime2;
const { hours, minutes, seconds, milliseconds } = parseDuration(diff);
console.log(
`${time1} - ${time2} = ${minTwoDigits(hours)}:${minTwoDigits(
minutes
)}:${minTwoDigits(seconds)}.${milliseconds}`
);

最新更新