我在使用JavaScript生成的代码中遇到了问题。我想计算一个24小时制的两次之间的差异。数据来自两个输入时间字段:
<input type="time" id="start" />
<input type="time" id="end" />
因此,时间以字符串00:00进行,这对数字计算没有帮助。
我解决的方法是从最后开始减去开始。如果结束时间更长,这可以完美地工作,但是如果结束时间超过11:00(00:00),我最终会得到一个负数。我已经尝试在结果中添加24,如果结束低于开始,但我仍然得到负数。这似乎是一个愚蠢的问题,但我从来没有那么擅长数学。
var numHours;
if(time_end < time_start){
numHours = parseInt(t_e.substring(0,2)) - parseInt(t_s.substring(0,2)) + 24;
}else{
numHours = parseInt(t_e.substring(0,2)) - parseInt(t_s.substring(0,2));
}
可能(肯定)有更好的方法可以做到这一点,但我怎样才能让它发挥作用。我也可以计算分钟数以获得更准确的时差。
答案 0 :(得分:3)
所提供的解决方案并未有效地解释日边界。所有这一切都假设差异小于24小时。这意味着我们在23小时和59分钟的开始和结束之间有一个上限,否则我们会对结果感到困惑。但请记住,正如所描述的,一个真实的用例是一个事件从晚上11点开始,到凌晨1点结束(从23:00到1:00),差异是2小时而不是22小时。
function calculateTime(e) {
var startTime = $('#start').val();
var endTime = $('#end').val();
var startTimeArray = startTime.split(":");
var startInputHrs = parseInt(startTimeArray[0]);
var startInputMins = parseInt(startTimeArray[1]);
var endTimeArray = endTime.split(":");
var endInputHrs = parseInt(endTimeArray[0]);
var endInputMins = parseInt(endTimeArray[1]);
var startMin = startInputHrs*60 + startInputMins;
var endMin = endInputHrs*60 + endInputMins;
var result;
if (endMin < startMin) {
var minutesPerDay = 24*60;
result = minutesPerDay - startMin; // Minutes till midnight
result += endMin; // Minutes in the next day
} else {
result = endMin - startMin;
}
var minutesElapsed = result % 60;
var hoursElapsed = (result - minutesElapsed) / 60;
alert ( "Elapsed Time : " + hoursElapsed + ":" + (minutesElapsed < 10 ?
'0'+minutesElapsed : minutesElapsed) ) ;
}
我没有检查,但我相信你可以这样做,但我没有检查它:
var result = endMin - startMin;
if (result < 0 ) result = (24*60) + result;
答案 1 :(得分:1)
对于这个有限的用例,一个最有效的解决方案是将这两个时间转换为从一天开始以来的总分钟数,然后减去。
伪代码:
startMin = startInputHrs * 60 + startInputMin
endMin = endInputHrs * 60 + endInputMin
timeDifference = endMin - startMin
由您决定如何处理否定结果。也许给用户一个错误信息,并告诉他们开始时间必须在结束时间之前?
答案 2 :(得分:0)
我是初学者,有些高手可能会在2行中找到答案:),但这里是.....这是有效的。 input是&#34; 1:20 pm-2:30 am&#34;。
形式的字符串function CountingMinutesI(str) {
split = str.split('-')
startTime = split[0]
endTime = split[1]
// for end time
if (endTime === '12:00am') { endInMinutes = 0}
else if (endTime.charAt(endTime.length-2) === 'a') {
if (endTime.substr(0, 2) === '12') {
endInMinutes = parseInt(endTime.split(':')[1].replace(/[a-z]/gi, ''))
}
else {
endHours = endTime.split(':')[0]
endMins = endTime.split(':')[1].replace(/[a-z]/gi, '')
endInMinutes = (parseInt(endHours)*60) + parseInt(endMins)
}
}
else if (endTime === '12:00pm') {endInMinutes = 720}
else {
endHours = endTime.split(':')[0]
endMins = endTime.split(':')[1].replace(/[a-z]/gi, '')
endInMinutes = (parseInt(endHours)*60 + 720) + parseInt(endMins)
}
// for start time
if (startTime === '12:00am') { startInMinutes = 0}
else if (startTime.charAt(startTime.length-2) === 'a') {
if (startTime.substr(0, 2) === '12') {
startInMinutes = parseInt(startTime.split(':')[1].replace(/[a-z]/gi, ''))
}
else {
startHours = startTime.split(':')[0]
startMins = startTime.split(':')[1].replace(/[a-z]/gi, '')
startInMinutes = (parseInt(startHours)*60) + parseInt(startMins)
}
}
else if (startTime.substr(0,2) === '12') {startInMinutes = 720 + parseInt(startTime.split(':')[1].replace(/[a-z]/gi, ''))}
else {
startHours = startTime.split(':')[0]
startMins = startTime.split(':')[1].replace(/[a-z]/gi, '')
startInMinutes = (parseInt(startHours)*60 + 720) + parseInt(startMins)
}
if (endInMinutes > startInMinutes) {output = endInMinutes - startInMinutes}
else {output = 1440 - (startInMinutes - endInMinutes)}
return output
}