Làm cách nào để so sánh hai chuỗi thời gian ở định dạng HH: MM: SS?


83

Tôi có hai chuỗi thời gian ở định dạng HH: MM: SS . Ví dụ, str1chứa 10:20:45, str2chứa 5:10:10.

Làm cách nào để so sánh các giá trị trên?



14
Có phải là 24h? Sau đó, bạn có thể thực hiện so sánh chuỗi đơn giản. Btw, 5:10:10không phải HH:MM...nó là duy nhất H:MM:.... Nhưng để so sánh chuỗi, cả hai thực sự phải ở cùng một định dạng.
Felix Kling

Câu trả lời:


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

Ngày 1 tháng Giêng là một ngày tùy ý, không có ý nghĩa gì cả.


5
Lưu ý : Việc phân tích cú pháp các chuỗi với không Date.parseđược khuyến khích do sự khác biệt và không nhất quán của trình duyệt. MDN
Zev Isert,

156

Như Felix Kling đã nói trong các nhận xét, với điều kiện thời gian của bạn dựa trên đồng hồ 24 giờ (và đúng như vậy nếu không có SA / CH) và miễn là chúng luôn ở định dạng HH:MM:SSmà bạn có thể thực hiện so sánh chuỗi trực tiếp:

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

Điều này phụ thuộc vào việc sử dụng ASCII cho đại diện từ các mã là thuận tiện để

với phương pháp này nếu tôi so sánh chuỗi str1 = "00:10"với str2 = "01:10"và kiểm tra xem nếu chuỗi 1 lớn hơn thì chuỗi 2 chuỗi cảnh báo một chuỗi lớn hơn còn lại chuỗi cảnh báo 2 lớn hơn Tôi nghĩ 12PM lớn hơn 1AM nhưng nó cho thấy chuỗi 2 lớn hơn
Ali

1
@ Mubeen1992: đó là lý do tại sao câu trả lời của tôi nói rằng điều này yêu cầu thời gian dựa trên đồng hồ 24 giờ. Bạn phải sử dụng một phương pháp khác cho kịch bản của mình.
Andy E

2
@ Mubeen1992: 1:10amlà định dạng thời gian 24 giờ không đều. 01:10sẽ đúng hơn và 01:10sẽ so sánh đúng với 12:10. Như tôi đã nói, đối với chuỗi của bạn, bạn cần sử dụng một phương pháp khác.
Andy E

1
Điều này thật tuyệt vời, tôi yêu sự đơn giản. Mọi phương pháp khác mà tôi tìm thấy đều buộc tôi phải áp đặt (ngầm hoặc rõ ràng) một ngày lên trên thời gian, nhưng tôi chỉ quan tâm đến thời gian, vì vậy điều này là hoàn hảo.
Jonathan Simon

7

Date đối tượng trong so sánh hỗ trợ js, hãy đặt chúng cùng ngày để so sánh hh: mm: ss:

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

5

Hãy thử mã này cho định dạng thời gian 24 giờ.

<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

Bạn có thể dễ dàng làm điều đó với mã dưới đây:

Lưu ý : Đối số thứ hai trong RegExp là 'g' là cờ tìm kiếm toàn cục. Cờ tìm kiếm toàn cục làm cho RegExp tìm kiếm một mẫu trong suốt chuỗi, tạo ra một mảng tất cả các lần xuất hiện mà nó có thể tìm thấy khớp với mẫu đã cho. Mã bên dưới chỉ hoạt động nếu thời gian ở định dạng HH: MM: SS tức là định dạng thời gian 24 giờ .

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

Hãy thử mã này.

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

Chuyển đổi thành giây các chuỗi đó:

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

Tôi đã cải thiện chức năng này từ giải pháp @ kamil-p. Tôi bỏ qua giây so sánh. Bạn có thể thêm logic giây vào chức năng này bằng cách chú ý đến việc sử dụng.

Chỉ làm việc cho định dạng thời gian "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;
    }
}

thí dụ

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

Cảm ơn @ kamil-p


1

Cách tốt nhất để so sánh thời gian bằng cách sử dụng chuyển đổi thành ms

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

return minutesOfDay(now) > minutesOfDay(end);

Lưu ý rằng đã có một câu trả lời được chấp nhận cho câu hỏi này. Vui lòng chỉnh sửa câu trả lời của bạn để đảm bảo rằng nó được cải thiện khi có các câu trả lời khác đã có trong câu hỏi này.
hongsy

0

Bạn có thể so sánh hai giá trị ngay sau khi tách chúng bằng ':'.


Tại sao bạn cần phải chia chúng?
HoldOffHunger 14/09/17

Có nhiều cách thông minh hơn để làm điều đó. ví dụ: sử dụng Date or moment.js
Koray Küpe

0

Tôi không thoải mái lắm với các biểu thức chính quy và ví dụ của tôi là kết quả từ trường bộ chọn ngày có định dạng m / d / Y h: mA. Trong ví dụ pháp lý này, bạn phải đến trước phiên điều trần thực tế về việc bãi nại. Tôi sử dụng chức năng thay thế để xóa ngày tháng để tôi có thể xử lý chúng dưới dạng đối tượng Ngày tháng và so sánh chúng.

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

Tôi nghĩ bạn có thể đặt nó như thế này.

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

Đặt phần thời gian được trích xuất thành các biến.

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

Hàm của bạn sẽ trả về 1cho 0:0:5, 0:1:0ghép nối và điều đó là sai.
Styx

1
chào mừng đến với SO! Sẽ rất hữu ích nếu bạn giải thích một chút về mã chứ không chỉ đoạn mã.
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...
                }

Không hoạt động. Định dạng là "12:34:56". Điều này đang coi giờ là phút, phút là giây và nó bỏ qua giây: var stMin = (parseInt (sts [0]) * 60 + parseInt (sts [1]));
HoldOffHunger 14/09/17
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.