0

我在 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));
}

可能(肯定)有更好的方法来做到这一点,但我怎样才能让它发挥作用。我也可以计算分钟以获得更准确的时差。

4

3 回答 3

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;
于 2013-11-14T02:03:37.570 回答
1

一个简单的解决方案可能对这个有限的用例最有效,就是将这两个时间都转换为自一天开始以来的总分钟数,然后减去。

伪代码:

startMin = startInputHrs * 60 + startInputMin
endMin = endInputHrs * 60 + endInputMin

timeDifference = endMin - startMin

如何处理负面结果取决于您。也许给用户一条错误消息,并告诉他们开始时间必须早于结束时间?

于 2013-11-14T00:37:09.687 回答
0

我是一个初学者,一些高手可能会在两行中给出一个答案:),但在这里......这是可行的。输入是“1:20pm-2:30am”形式的字符串。

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
}
于 2015-03-11T06:59:09.110 回答