【问题标题】:How can I compare two time strings in the format HH:MM:SS?如何比较 HH:MM:SS 格式的两个时间字符串?
【发布时间】:2021-07-06 14:43:00
【问题描述】:

我有两个 HH:MM:SS 格式的时间字符串。例如,str1 包含 10:20:45str2 包含 5:10:10

如何比较上述值?

【问题讨论】:

  • Compare time in javascript 的可能重复项
  • 是24小时吗?然后你可以做简单的字符串比较。顺便说一句,5:10:10 不是HH:MM... 它只是H:MM:...。但是对于字符串比较,两者确实必须采用相同的格式。

标签: javascript


【解决方案1】:

正如 Felix Kling 在 cmets 中所说,只要您的时间基于 24 小时制(如果没有 AM/PM,它们应该是)并且它们始终采用 @987654321 格式@你可以直接做字符串比较:

var str1 = "10:20:45",
    str2 = "05:10:10";

if (str1 > str2)
    alert("Time 1 is later than time 2");
else
    alert("Time 2 is later than time 1");

【讨论】:

  • 这取决于使用 ASCII 表示,因为代码很方便地按顺序排列
  • 如果我用这种方法比较字符串str1 = "00:10"str2 = "01:10" 并检查字符串1 是否大于字符串2 警报字符串字符串1 更大,否则警报字符串2 更大我认为12PM 更大比凌晨 1 点,但它显示字符串 2 更大
  • @Mubeen1992:这就是为什么我的回答说这要求时间基于 24 小时制。你必须为你的场景使用不同的方法。
  • @Mubeen1992: 1:10am 是不规则的 24 小时时间格式。 01:10 会更正确,01:10 会与 12:10 进行正确比较。就像我说的,对于你的字符串,你需要使用不同的方法。
  • 这太棒了,我喜欢简单。我发现的所有其他方法都迫使我(隐式或显式)在时间之上加上一个日期,但我关心时间,所以这是完美的。
【解决方案2】:
Date.parse('01/01/2011 10:20:45') > Date.parse('01/01/2011 5:10:10')
> true

1 月 1 日是任意日期,没有任何意义。

【讨论】:

  • 注意:由于浏览器的差异和不一致,强烈建议不要使用 Date.parse 解析字符串。 MDN
【解决方案3】:

Date js 中的对象支持比较,设置它们相同的日期进行比较 hh:mm:ss :

new Date ('1/1/1999 ' + '10:20:45') > new Date ('1/1/1999 ' + '5:10:10') 
> true

【讨论】:

    【解决方案4】:

    试试这个 24 小时格式的代码。

    <script type="text/javascript">
    var a="12:23:35";
    var b="15:32:12";
    var aa1=a.split(":");
    var aa2=b.split(":");
    
    var d1=new Date(parseInt("2001",10),(parseInt("01",10))-1,parseInt("01",10),parseInt(aa1[0],10),parseInt(aa1[1],10),parseInt(aa1[2],10));
    var d2=new Date(parseInt("2001",10),(parseInt("01",10))-1,parseInt("01",10),parseInt(aa2[0],10),parseInt(aa2[1],10),parseInt(aa2[2],10));
    var dd1=d1.valueOf();
    var dd2=d2.valueOf();
    
    if(dd1<dd2)
    {alert("b is greater");}
    else alert("a is greater");
    }
    </script>
    

    【讨论】:

      【解决方案5】:

      您可以使用以下代码轻松完成:

      注意:RegExp 中的第二个参数是'g',它是全局搜索标志。 全局搜索标志使正则表达式在整个字符串中搜索模式,创建一个它可以找到与给定模式匹配的所有匹配项的数组。 以下代码仅适用于时间为 HH:MM:SS 格式,即 24 小时时间格式

      var regex = new RegExp(':', 'g'),
          timeStr1 = '5:50:55',
          timeStr2 = '6:17:05';
      if(parseInt(timeStr1.replace(regex, ''), 10) < parseInt(timeStr2.replace(regex, ''), 10)){
        console.log('timeStr1 is smaller then timeStr2');
      } else {
        console.log('timeStr2 is smaller then timeStr1');
      }
      

      【讨论】:

        【解决方案6】:

        试试这个代码。

        var startTime = "05:01:20";
        var endTime = "09:00:00";
        var regExp = /(\d{1,2})\:(\d{1,2})\:(\d{1,2})/;
        if(parseInt(endTime .replace(regExp, "$1$2$3")) > parseInt(startTime .replace(regExp, "$1$2$3"))){
        alert("End time is greater");
        }
        

        【讨论】:

          【解决方案7】:

          将这些字符串转换为秒:

          var str1 = '10:20:45';
          var str2 = '5:10:10';
          
          str1 =  str1.split(':');
          str2 =  str2.split(':');
          
          totalSeconds1 = parseInt(str1[0] * 3600 + str1[1] * 60 + str1[0]);
          totalSeconds2 = parseInt(str2[0] * 3600 + str2[1] * 60 + str2[0]);
          
          // compare them
          
          if (totalSeconds1 > totalSeconds2 ) { // etc...
          

          【讨论】:

            【解决方案8】:

            我从@kamil-p 解决方案改进了这个功能。 我忽略了秒比较。您可以通过注意您的使用来为此功能添加秒逻辑。

            仅适用于“HH:mm”时间格式。

            function compareTime(str1, str2){
                if(str1 === str2){
                    return 0;
                }
                var time1 = str1.split(':');
                var time2 = str2.split(':');
                if(eval(time1[0]) > eval(time2[0])){
                    return 1;
                } else if(eval(time1[0]) == eval(time2[0]) && eval(time1[1]) > eval(time2[1])) {
                    return 1;
                } else {
                    return -1;
                }
            }
            

            例子

            alert(compareTime('8:30','11:20'));
            

            感谢@kamil-p

            【讨论】:

              【解决方案9】:

              使用转换为毫秒来比较时间的最佳方法

              var minutesOfDay = function(m){
                    return m.minutes() + m.hours() * 60;
                  }
              
              return minutesOfDay(now) > minutesOfDay(end);
              

              【讨论】:

              • 请注意,这个问题已经有一个公认的答案。请edit您的答案,以确保它改进了此问题中已经存在的其他答案。
              【解决方案10】:

              您可以在用 ':' 分割两个值后立即比较它们。

              【讨论】:

              • 为什么需要拆分它们?
              • 有更聪明的方法可以做到这一点。例如:使用 Date 或 moment.js
              【解决方案11】:

              我对正则表达式不太满意,我的示例来自格式化为 m/d/Y h:mA 的 datetimepicker 字段。在这个法律示例中,您必须在实际的证词听证会之前到达。我使用替换功能来清理日期,以便我可以将它们作为 Date 对象处理并进行比较。

              function compareDateTimes() {
                  //date format ex "04/20/2017 01:30PM"
                  //the problem is that this format results in Invalid Date
                  //var d0 = new Date("04/20/2017 01:30PM"); => Invalid Date
              
                  var start_date = $(".letter #depo_arrival_time").val();
                  var end_date = $(".letter #depo_dateandtime").val();
              
                  if (start_date=="" || end_date=="") {
                      return;
                  }
                  //break it up for processing
                  var d1 = stringToDate(start_date);
                  var d2 = stringToDate(end_date);
              
                  var diff = d2.getTime() - d1.getTime();
                  if (diff < 0) {
                      end_date = moment(d2).format("MM/DD/YYYY hh:mA");
                      $(".letter #depo_arrival_time").val(end_date);
                  }
              }
              
              function stringToDate(the_date) {
                  var arrDate = the_date.split(" ");
                  var the_date = arrDate[0];
                  var the_time = arrDate[1];
                  var arrTime = the_time.split(":");
                  var blnPM = (arrTime[1].indexOf("PM") > -1);
                  //first fix the hour
                  if (blnPM) {
                      if (arrTime[0].indexOf("0")==0) {
                          var clean_hour = arrTime[0].substr(1,1);
                          arrTime[0] = Number(clean_hour) + 12;
                      }
                      arrTime[1] = arrTime[1].replace("PM", ":00");
                  } else {
                      arrTime[1] = arrTime[1].replace("AM", ":00");
                  }
                  var date_object =  new Date(the_date);
                  //now replace the time
                  date_object = String(date_object).replace("00:00:00", arrTime.join(":"));
                  date_object =  new Date(date_object);
              
                  return date_object;
              }
              

              【讨论】:

                【解决方案12】:

                我觉得你可以这样说。

                var a = "10:20:45";
                var b = "5:10:10";
                
                var timeA = new Date();
                timeA.setHours(a.split(":")[0],a.split(":")[1],a.split(":")[2]);
                timeB = new Date();
                timeB.setHours(b.split(":")[0],b.split(":")[1],b.split(":")[2]);
                
                var x= "B is later than A";
                if(timeA>timeB) x = "A is later than B";
                document.getElementById("demo").innerHTML = x;
                &lt;p id="demo"&gt;&lt;/p&gt;

                【讨论】:

                  【解决方案13】:

                  将提取的部分时间设置为变量。

                  // If you don't have the second part then set it to 00.
                  
                   //Create date object and set the time to that
                   var startTimeObject = new Date();
                   startTimeObject.setHours(startHour, startMinute, startSecond);
                  
                   //Create date object and set the time to that
                   var endTimeObject = new Date(startTimeObject);
                   endTimeObject.setHours(endHour, endMinute, endSecond);
                  
                   //Now we are ready to compare both the dates
                   if(startTimeObject > endTimeObject) {
                       alert('End time should be after start time.');
                   }
                   else {
                       alert('Entries are perfect.');
                   }
                  

                  【讨论】:

                    【解决方案14】:

                    时间格式应为 HH:mm:ss HH,24 小时格式

                    if (start_time > end_time)
                        console.log('start time is greater than end time')
                    else console.log('end time is greater than start time')
                    

                    【讨论】:

                      【解决方案15】:
                      var str1 = "150:05:05",
                      var str2 = "80:04:59";   
                      
                      function compareTime(str1, str2){
                      
                          if(str1 === str2){
                              return 0;
                          }
                      
                          var time1 = str1.split(':');
                          var time2 = str2.split(':');
                      
                          for (var i = 0; i < time1.length; i++) {
                              if(time1[i] > time2[i]){
                                  return 1;
                              } else if(time1[i] < time2[i]) {
                                  return -1;
                              }
                          }
                      }
                      

                      【讨论】:

                      • 你的函数会为0:0:50:1:0对返回1,这是错误的。
                      • 欢迎来到 SO!对代码进行一些解释会很有帮助,而不仅仅是 sn-p。
                      【解决方案16】:
                      var startTime = getTime(document.getElementById('startTime').value);
                                      var endTime = getTime(document.getElementById('endTime').value);
                      
                      
                                      var sts = startTime.split(":");
                                      var ets = endTime.split(":");
                      
                                      var stMin = (parseInt(sts[0]) * 60 + parseInt(sts[1]));
                                      var etMin = (parseInt(ets[0]) * 60 + parseInt(ets[1]));
                                      if( etMin > stMin) {
                                      // do your stuff...
                                      }
                      

                      【讨论】:

                      • 不起作用。格式为“12:34:56”。这将小时视为分钟,将分钟视为秒,并忽略秒: var stMin = (parseInt(sts[0]) * 60 + parseInt(sts[1]));
                      猜你喜欢
                      • 2014-06-10
                      • 1970-01-01
                      • 2020-09-11
                      • 1970-01-01
                      • 2019-07-25
                      • 2015-11-26
                      • 2014-05-08
                      • 1970-01-01
                      • 2021-07-05
                      相关资源
                      最近更新 更多