Як можна порівняти дві строки часу у форматі HH: MM: SS?


83

У мене є дві строки часу у форматі HH: MM: SS . Наприклад, str1містить 10:20:45, str2містить 5:10:10.

Як я можу порівняти наведені вище значення?



14
Це 24 години? Тоді ви можете зробити просте порівняння рядків. До речі, 5:10:10хіба HH:MM...це не тільки H:MM:.... Але для порівняння рядків обидва насправді мають бути в одному форматі.
Фелікс Клінг,

Відповіді:


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

1 січня - довільна дата, нічого не означає.


5
Примітка : Синтаксичний розбір рядків з Date.parseнастійно не рекомендується через різницю та невідповідність браузера. MDN
Зев Ісерт

156

Як сказав Фелікс Клінг у коментарях, за умови, що ваш час базується на 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 рядок попереджувального рядка, один більше, інакше рядок попередження 2 більший, я думаю, що 12 вечора є більшим за 1 ранку, але він показує, що рядок 2 більший
Алі

1
@ Mubeen1992: ось чому моя відповідь говорить, що це вимагає, щоб час базувався на 24-годинному годиннику. Вам потрібно використовувати інший метод для вашого сценарію.
Andy E

2
@ Mubeen1992: 1:10amє нерегулярним як цілодобовий формат часу. 01:10було б правильнішим і правильно 01:10порівнювалося б із 12:10. Як я вже сказав, для ваших рядків вам потрібно використовувати інший метод.
Andy E

1
Це чудово, я люблю простоту. Кожен інший метод, який я знайшов, змушував мене нав'язувати (неявно або явно) дату поверх часу, але я дбаю лише про час, тому це ідеально.
Джонатан Саймон,

7

Date об'єкт у js підтримує порівняння, встановіть їм однакову дату для порівняння hh: mm: ss:

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 шукати шаблон по всьому рядку, створюючи масив усіх випадків, які він може знайти, що відповідають даному шаблону. Нижче код працює, лише якщо час у форматі 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');
}

2

Спробуйте цей код.

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. Я проігнорував порівняння секунд. Ви можете додати секундологічну логіку до цієї функції, звертаючи увагу на ваше використання.

Працюйте лише для часового формату "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


1

Найкращий спосіб порівняти час за допомогою перетворення в мс

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

return minutesOfDay(now) > minutesOfDay(end);

Зверніть увагу, що на це питання вже є прийнята відповідь. Будь ласка, відредагуйте свою відповідь, щоб переконатися, що вона покращує інші відповіді, вже присутні в цьому питанні.
hongsy

0

Ви можете порівняти два значення одразу після того, як розділили їх на ':'.


Навіщо вам потрібно їх розділяти?
HoldOffHunger

Для цього є розумніші способи. наприклад: за допомогою Date or moment.js
Koray Küpe

0

Мені не так зручно користуватися регулярними виразами, і мій приклад є результатом поля datetimepicker у форматі m / d / Y h: mA. У цьому юридичному прикладі ви повинні прибути до фактичного слухання депозитів. Я використовую функцію replace для очищення дат, щоб я міг обробити їх як об'єкти 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! Було б корисним трохи пояснити код, а не лише фрагмент.
снайпер

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