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?

Wskaźnik zerowy
źródło
1
możliwy duplikat czasu porównania w javascript
lonesomeday
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.

Evgeny Shadchnev
źródło
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");
Andy E.
źródło
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
hien
źródło
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>
Suresh Krishnamoorthi
źródło
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');
}
Kishan Patel
źródło
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");
}
niksvp
źródło
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...
pmiranda
źródło
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

Ghasem Aladaghlou
źródło
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);
Sublime Laravel Dev
źródło
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

Możesz porównać te dwie wartości zaraz po podzieleniu ich znakiem „:”.

patapizza
źródło
Dlaczego miałbyś je dzielić?
HoldOffHunger
Są na to sprytniejsze sposoby. np .: przy użyciu Date lub moment.js
Koray Küpe,
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;
}
Nicolas Giszpenc
źródło
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>

GameBoy
źródło
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.');
 }
Irshad Khan
źródło
-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;
        }
    }
}
Kamil P.
źródło
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...
                }
Richardson V Johnson
źródło
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