Как я могу сравнить две строки времени в формате ЧЧ: ММ: СС?


87

У меня есть две строки времени в формате ЧЧ: ММ: СС . Например, str1содержит 10:20:45, str2содержит 5:10:10.

Как я могу сравнить вышеуказанные значения?


1
возможный дубликат времени сравнения в javascript
lonesomeday

14
Это 24 часа? Затем вы можете выполнить простое сравнение строк. Кстати, 5:10:10не так HH:MM...ли H:MM:...? Но для сравнения строк оба действительно должны быть в одном формате.
Felix Kling

Ответы:


123
Date.parse('01/01/2011 10:20:45') > Date.parse('01/01/2011 5:10:10')
> true

1 января - дата произвольная, ничего не значит.


5
Примечание . Синтаксический анализ строк с помощью Date.parseнастоятельно не рекомендуется из-за различий и несоответствий браузеров. MDN
Зев

159

Как сказал Феликс Клинг в комментариях, при условии, что ваше время основано на 24-часовых часах (и они должны быть, если нет AM / PM), и при условии, что они всегда находятся в формате, в котором HH:MM:SSвы можете выполнить прямое сравнение строк:

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 больше, я думаю, что 12 вечера больше, чем 1:00, но он показывает, что строка 2 больше
Али

1
@ Mubeen1992: вот почему в моем ответе говорится, что время должно быть основано на 24-часовом формате. Вы должны использовать другой метод для своего сценария.
Andy E

2
@ Mubeen1992: 1:10amнеправильный 24-часовой формат времени. 01:10было бы правильнее и 01:10сравнил бы как следует 12:10. Как я уже сказал, для ваших строк вам нужно использовать другой метод.
Энди Э

1
Это великолепно, мне нравится простота. Любой другой метод, который я нашел, заставлял меня накладывать (неявно или явно) дату поверх времени, но меня волнует только время, так что это идеально.
Джонатан Саймон

7

Date объект в сравнении поддержки js, установите для них ту же дату для сравнения чч: мм: сс:

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

5

Попробуйте этот код для 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>

4

Вы можете легко сделать это с помощью кода ниже:

Примечание . Второй аргумент в RegExp - это «g», который является флагом глобального поиска. Флаг глобального поиска заставляет RegExp искать шаблон по всей строке, создавая массив всех вхождений, которые он может найти, соответствующих данному шаблону. Приведенный ниже код работает только в том случае, если время указано в формате ЧЧ: ММ: СС, т.е. в 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');
}

3

Попробуйте этот код.

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");
}

2

Преобразуйте эти строки в секунды:

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...

1

Я улучшил эту функцию из решения @ kamil-p. Я проигнорировал сравнение секунд. Вы можете добавить секундную логику к этой функции, уделив особое внимание использованию.

Работает только с форматом времени «ЧЧ: мм».

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


1

Лучший способ сравнить время с помощью преобразования в мс

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

return minutesOfDay(now) > minutesOfDay(end);

Обратите внимание, что на этот вопрос уже есть принятый ответ. Пожалуйста , измените свой ответ , чтобы гарантировать , что она улучшает другие ответы , уже присутствующих в этом вопросе.
hongsy

0

Вы можете сравнить два значения сразу после их разделения с помощью ':'.


Зачем вам нужно их разделять?
HoldOffHunger

Есть более разумные способы сделать это. например: с использованием Date или moment.js
Корай Кюпе

0

Мне не очень нравятся регулярные выражения, и мой пример является результатом поля datetimepicker в формате m / d / Y h: mA. В этом юридическом примере вы должны явиться до фактического слушания дела о снятии показаний. Я использую функцию замены для очистки дат, чтобы я мог обрабатывать их как объекты 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;
}

0

Думаю, можно так выразиться.

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;
<p id="demo"></p>


0

Установите извлеченную часть времени для переменных.

// 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.');
 }

-1
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;
        }
    }
}

Ваша функция будет возвращать 1для 0:0:5, 0:1:0паров, и это неправильно.
Styx

1
добро пожаловать в SO! Было бы полезно получить небольшое объяснение кода, а не только его фрагмента.
sniperd

-3
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]));
HoldOffHunger
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.