Jak mogę porównać dwa ciągi czasu w formacie HH: MM: SS?


88

Mam dwa ciągi czasu w formacie HH: MM: SS . Na przykład str1zawiera 10:20:45, str2zawiera 5:10:10.

Jak mogę porównać powyższe wartości?



14
Czy to 24h? Następnie możesz wykonać proste porównanie ciągów. Btw, czy 5:10:10to nie HH:MM...tylko H:MM:.... Ale dla porównania ciągów oba muszą być w tym samym formacie.
Felix Kling

Odpowiedzi:


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

1 stycznia to dowolna data, nic nie znaczy.


5
Uwaga : analizowanie ciągów za pomocą Date.parsejest zdecydowanie odradzane ze względu na różnice i niespójności przeglądarek. MDN
Zev Isert

160

Jak powiedział Felix Kling w komentarzach, pod warunkiem, że twoje godziny są oparte na zegarze 24-godzinnym (i powinny być, jeśli nie ma AM / PM) i pod warunkiem, że są zawsze w formacie HH:MM:SS, możesz wykonać bezpośrednie porównanie ciągów:

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

Jest to zależne od użycia ASCII do reprezentacji, ponieważ kody są dogodnie uporządkowane

za pomocą tej metody, jeśli porównam ciąg str1 = "00:10"z str2 = "01:10"i sprawdzę, czy jeśli ciąg 1 jest większy, to ciąg 2 ciąg znaków ostrzegawczych jeden jest większy w przeciwnym razie ostrzeżenie ciąg 2 jest większy Myślę, że godzina dwunasta jest większa niż 1 w nocy, ale pokazuje, że ciąg 2 jest większy
Ali

1
@ Mubeen1992: dlatego moja odpowiedź mówi, że wymaga to, aby czasy były oparte na zegarze 24-godzinnym. Musisz użyć innej metody w swoim scenariuszu.
Andy E

2
@ Mubeen1992: 1:10amjest nieregularny jako format 24-godzinny. 01:10byłoby bardziej poprawne i można 01:10by go odpowiednio porównać z 12:10. Tak jak powiedziałem, dla twoich strun musisz użyć innej metody.
Andy E,

1
To jest genialne, uwielbiam prostotę. Każda inna metoda, którą znalazłem, zmusiła mnie do narzucenia (pośrednio lub jawnie) daty na szczycie czasu, ale zależy mi tylko na czasie, więc jest to idealne.
Jonathan Simon

7

Date obiekt w porównaniu z obsługą js, ustaw dla nich tę samą datę do porównania gg: mm: ss:

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

5

Wypróbuj ten kod dla formatu 24-godzinnego.

<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

Możesz to łatwo zrobić za pomocą poniższego kodu:

Uwaga : Drugi argument w RegExp to „g”, który jest flagą wyszukiwania globalnego. Globalna flaga wyszukiwania sprawia, że ​​RegExp wyszukuje wzorzec w ciągu, tworząc tablicę wszystkich wystąpień, które może znaleźć, pasujących do danego wzorca. Poniższy kod działa tylko wtedy, gdy czas jest w formacie HH: MM: SS, czyli w formacie 24-godzinnym .

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

Wypróbuj ten kod.

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

Zamień na sekundy te ciągi:

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

Poprawiłem tę funkcję z rozwiązania @ kamil-p. Zignorowałem porównanie sekund. Możesz dodać logikę sekund do tej funkcji, zwracając uwagę na użycie.

Działa tylko dla formatu czasu „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;
    }
}

przykład

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

Dzięki @ kamil-p


1

Najlepszy sposób na porównanie czasów przy użyciu funkcji Convert to ms

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

return minutesOfDay(now) > minutesOfDay(end);

Zauważ, że istnieje już zaakceptowana odpowiedź na to pytanie. Proszę edytować swoje odpowiedzi, aby zapewnić, że poprawia po innych odpowiedzi już obecnych w tej kwestii.
hongsy


0

Nie czuję się dobrze z wyrażeniami regularnymi, a mój przykład wynika z pola datetimepicker w formacie m / d / Y h: mA. W tym przykładzie prawnym musisz stawić się przed faktycznym przesłuchaniem. Używam funkcji replace w celu wyczyszczenia dat, aby móc je przetwarzać jako obiekty Date i porównywać.

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

Myślę, że możesz to ująć w ten sposób.

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

Ustaw wyodrębnioną część czasu na zmienne.

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

Twoja funkcja powróci 1do 0:0:5, 0:1:0pary, a to źle.
Styx

1
witamy w SO! Przydałoby się trochę wyjaśnienia kodu, a nie tylko fragmentu.
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...
                }

Nie działa. Format to „12:34:56”. Traktuje godziny jako minuty, minuty jako sekundy i ignoruje sekundy: var stMin = (parseInt (sts [0]) * 60 + parseInt (sts [1]));
HoldOffHunger
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.