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

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);
Возвышенный разработчик Laravel
источник
Обратите внимание, что на этот вопрос уже есть принятый ответ. Пожалуйста , измените свой ответ , чтобы гарантировать , что она улучшает другие ответы , уже присутствующих в этом вопросе.
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