Câu hỏi So sánh hai ngày với JavaScript


Ai đó có thể đề xuất một cách để so sánh các giá trị của hai ngày lớn hơn, nhỏ hơn và không sử dụng JavaScript trong quá khứ? Các giá trị sẽ đến từ các hộp văn bản ...


1378
2018-01-29 19:14


gốc


Khi nói đến DateTime và thao tác trong JS, tôi không nhìn xa hơn momentjs :) - Halceyon
không cần sử dụng momentjs để so sánh 2 ngày. Chỉ cần sử dụng đối tượng Date của javascript thuần túy. Kiểm tra câu trả lời chính để biết thêm chi tiết. - Lukas
Yea thích bao gồm thêm 20kb minified JS để so sánh hai ngày ..... vô lý - DanFromGermany
Bạn có thể tham khảo câu trả lời sau: stackoverflow.com/questions/4812152/…  Kiểm tra getDateDifference và getDifferenceInDays nếu nó có thể trợ giúp. - Vikash Rajpurohit
Tôi sẽ cung cấp cho bạn một lý do để nhìn xa hơn Moment.js (mà tôi yêu, NHƯNG ...): Không sử dụng cho tải vòng lặp - Geek Stocks


Các câu trả lời:


Các Đối tượng ngày tháng sẽ làm những gì bạn muốn - xây dựng một cái cho mỗi ngày, sau đó so sánh chúng bằng cách sử dụng >, <, <= hoặc là >=.

Các ==, !=, ===!== các toán tử yêu cầu bạn sử dụng date.getTime() như trong

var d1 = new Date();
var d2 = new Date(d1);
var same = d1.getTime() === d2.getTime();
var notSame = d1.getTime() !== d2.getTime();

để được rõ ràng chỉ cần kiểm tra bình đẳng trực tiếp với các đối tượng dữ liệu sẽ không hoạt động

var d1 = new Date();
var d2 = new Date(d1);

console.log(d1 == d2);   // prints false (wrong!) 
console.log(d1 === d2);  // prints false (wrong!)
console.log(d1 != d2);   // prints true  (wrong!)
console.log(d1 !== d2);  // prints true  (wrong!)
console.log(d1.getTime() === d2.getTime()); // prints true (correct)

Tôi đề nghị bạn sử dụng thả xuống hoặc một số hình thức hạn chế tương tự của mục nhập ngày chứ không phải là hộp văn bản, mặc dù, vì sợ rằng bạn thấy mình trong địa ngục xác thực đầu vào.


1568
2018-01-29 19:20



Làm việc cho> <như câu hỏi tiểu bang nhưng tôi nghĩ rằng tôi chỉ muốn bình luận rằng nó không hoạt động nếu == kể từ khi các đối tượng mình là khác nhau. Ví dụ: var date1 = new Date (); var date2 = new Date (ngày1); date1 == date2 là sai. Nếu bạn làm date1.getTime () == date2.getTime () bạn nhận được sự thật. - ace
Ngay cả phương pháp của Ace cũng không an toàn. Bạn cần đặt lại mili giây trước và thậm chí bạn có thể muốn đặt lại toàn bộ thời gian. date1.setHours (0); date1.setMinutes (0); date1.setSeconds (0); date1.setMilliseconds (0); Kết hợp với việc sử dụng .getTime () sẽ cho bạn kết quả so sánh chính xác - patrick
Ace - cảm ơn phản hồi của bạn, bạn vừa mới tiết kiệm cho tôi một số thời gian khắc phục sự cố. Lưu ý cho những người tương lai: date1 === date2 cũng sẽ là false (3 =) - marta.joed
@patrick, đề xuất gọi điện setHours(0,0,0,0) cách này. Loại bỏ sự cần thiết phải gọi setMinutes() vv Ngoài ra, thực hiện nhanh hơn. - Karl
tránh == hoặc === để có được kết quả mong muốn: jsfiddle.net/P4y5J  now> = anotherNow && now <= anotherNow LÀ đúng FYI - Jason Sebring


Cách dễ nhất để so sánh các ngày trong javascript là trước tiên chuyển đổi nó thành một đối tượng Date và sau đó so sánh các đối tượng ngày tháng này.

Dưới đây bạn tìm thấy một đối tượng có ba hàm:

  • dates.compare (a, b)

    Trả về một số:

    • -1 nếu a <b
    • 0 nếu a = b
    • 1 nếu a> b
    • NaN nếu a hoặc b là ngày bất hợp pháp
  • dates.inRange (d, bắt đầu, kết thúc)

    Trả về boolean hoặc NaN:

    • thật nếu d nằm giữa khởi đầu và kết thúc (bao gồm)
    • sai nếu d là trước khởi đầu hoặc sau kết thúc.
    • NaN nếu một hoặc nhiều ngày tháng là bất hợp pháp.
  • dates.convert

    Được sử dụng bởi các hàm khác để chuyển đổi đầu vào của chúng thành đối tượng ngày tháng. Đầu vào có thể được

    • một ngày-object: Đầu vào được trả về như hiện tại.
    • một mảng: Giải thích là [năm, tháng, ngày]. CHÚ THÍCH tháng là 0-11.
    • một con số : Được giải thích là số mili giây kể từ ngày 1 tháng 1 năm 1970 (dấu thời gian)
    • một chuỗi : Một số định dạng khác nhau được hỗ trợ, như "YYYY / MM / DD", "MM / DD / YYYY", "Jan 31 2009", v.v.
    • một vật: Giải thích dưới dạng đối tượng có thuộc tính năm, tháng và ngày. CHÚ THÍCH tháng là 0-11.

.

// Source: http://stackoverflow.com/questions/497790
var dates = {
    convert:function(d) {
        // Converts the date in d to a date-object. The input can be:
        //   a date object: returned without modification
        //  an array      : Interpreted as [year,month,day]. NOTE: month is 0-11.
        //   a number     : Interpreted as number of milliseconds
        //                  since 1 Jan 1970 (a timestamp) 
        //   a string     : Any format supported by the javascript engine, like
        //                  "YYYY/MM/DD", "MM/DD/YYYY", "Jan 31 2009" etc.
        //  an object     : Interpreted as an object with year, month and date
        //                  attributes.  **NOTE** month is 0-11.
        return (
            d.constructor === Date ? d :
            d.constructor === Array ? new Date(d[0],d[1],d[2]) :
            d.constructor === Number ? new Date(d) :
            d.constructor === String ? new Date(d) :
            typeof d === "object" ? new Date(d.year,d.month,d.date) :
            NaN
        );
    },
    compare:function(a,b) {
        // Compare two dates (could be of any type supported by the convert
        // function above) and returns:
        //  -1 : if a < b
        //   0 : if a = b
        //   1 : if a > b
        // NaN : if a or b is an illegal date
        // NOTE: The code inside isFinite does an assignment (=).
        return (
            isFinite(a=this.convert(a).valueOf()) &&
            isFinite(b=this.convert(b).valueOf()) ?
            (a>b)-(a<b) :
            NaN
        );
    },
    inRange:function(d,start,end) {
        // Checks if date in d is between dates in start and end.
        // Returns a boolean or NaN:
        //    true  : if d is between start and end (inclusive)
        //    false : if d is before start or after end
        //    NaN   : if one or more of the dates is illegal.
        // NOTE: The code inside isFinite does an assignment (=).
       return (
            isFinite(d=this.convert(d).valueOf()) &&
            isFinite(start=this.convert(start).valueOf()) &&
            isFinite(end=this.convert(end).valueOf()) ?
            start <= d && d <= end :
            NaN
        );
    }
}

374
2018-01-31 00:18



(a > b) - (a < b) rất hữu ích cho việc sắp xếp các mảng ngày tháng - nktssh
@nikita Đúng vậy, và một hàm trả về kết quả đó có thể được sử dụng với Array.prototype.sort miễn là tất cả các giá trị đều là ngày hợp lệ. Nếu có thể có ngày không hợp lệ, tôi khuyên bạn nên sử dụng một cái gì đó như function ( a, b ) { a = a === undefined || a === null : NaN : a.valueOf( a ); b = a === undefined || b === null : NaN : a.valueOf( b ); return isFinite( a ) && isFinite( b ) ? ( a > b ) - ( a < b ) : NaN; } - some
@ nktssh — có thể, nhưng return a - b đơn giản hơn và thay thế toàn bộ câu lệnh trả về. - RobG


So sánh < và > như thường lệ, nhưng mọi thứ liên quan = nên sử dụng + tiếp đầu ngữ. Giống như vậy:

var x = new Date('2013-05-23');
var y = new Date('2013-05-23');

// less than, greater than is fine:
x < y; => false
x > y; => false
x === y; => false, oops!

// anything involving '=' should use the '+' prefix
// it will then compare the dates' millisecond values
+x <= +y;  => true
+x >= +y;  => true
+x === +y; => true

Hi vọng điêu nay co ich!


222
2018-05-23 12:21



khủng khiếp chậm :) Tôi thích x.getTime() === y.getTime() phương pháp, cả hai có thể đọc được và cực kỳ nhanh chóng xem jsperf - Housy
Các + toán tử cố gắng chuyển đổi biểu thức thành Số. Date.valueOf() được sử dụng để chuyển đổi (trả về cùng một điều như Date.getTime(). - Salman A
@WouterHuysentruit Cả hai đều rất nhanh (> 3 triệu OPS trong trình duyệt chậm nhất). Sử dụng phương pháp bạn nghĩ là dễ đọc hơn - Eloims
Lưu ý rằng bất cứ điều gì liên quan đến '=' nên sử dụng tiền tố '+' một phần câu trả lời của bạn không chính xác. <, <=, > và >= sử dụng cùng một thuật toán (thuật toán so sánh quan hệ trừu tượng) đằng sau hậu trường. - Salman A
Điều này làm việc cho tôi mà không cần cả dấu +. Tôi không biết tại sao. - Neri


Các toán tử quan hệ <  <=  >  >= có thể được sử dụng để so sánh các ngày JavaScript:

var d1 = new Date(2013, 0, 1);
var d2 = new Date(2013, 0, 2);
d1 <  d2; // true
d1 <= d2; // true
d1 >  d2; // false
d1 >= d2; // false

Tuy nhiên, các nhà khai thác bình đẳng ==  !=  ===  !== không thể được sử dụng để so sánh (giá trị của) ngày bởi vì:

  • Hai đối tượng riêng biệt không bao giờ bằng nhau đối với các so sánh nghiêm ngặt hoặc trừu tượng.
  • Một biểu thức so sánh các đối tượng chỉ đúng nếu các toán hạng tham chiếu cùng một đối tượng.

Bạn có thể so sánh giá trị của ngày cho bình đẳng bằng cách sử dụng bất kỳ phương pháp nào sau đây:

var d1 = new Date(2013, 0, 1);
var d2 = new Date(2013, 0, 1);
/*
 * note: d1 == d2 returns false as described above
 */
d1.getTime() == d2.getTime(); // true
d1.valueOf() == d2.valueOf(); // true
Number(d1)   == Number(d2);   // true
+d1          == +d2;          // true

Cả hai Date.getTime() và Date.valueOf() trả về số mili giây kể từ ngày 1 tháng 1 năm 1970, 00:00 giờ UTC. Cả hai Number chức năng và thống nhất + nhà điều hành gọi valueOf() phương pháp đằng sau hậu trường.


124
2018-01-31 16:04



Có an toàn khi chuyển đổi đối tượng Chuỗi thành Ngày không? Điều đó có thể không ném ngoại lệ hoặc đưa ra kết quả không đáng tin cậy? Điều gì có thể là cách đáng tin cậy nhất để làm ngày hẹn hò trong JS? Khi bạn nói kết quả không đáng tin cậy, phương pháp này có thể cung cấp các giá trị khác nhau / sai ngay cả khi chúng tôi chắc chắn định dạng ngày sẽ không thay đổi -> Nó sẽ là "Thứ Năm, ngày 10 tháng 8 năm 2017". Sự giúp đỡ của bạn ở đây được rất nhiều đánh giá cao. - user2696258
Điều này có thể cho kết quả không đáng tin cậy cho cùng một giá trị ngày trên các hệ điều hành / trình duyệt / thiết bị khác nhau không? - user2696258
@ user2696258 đây là cách đáng tin cậy nhất để so sánh hai Ngày các đối tượng. Chuyển đổi một chuỗi cho đến nay là một vấn đề khác ... sử dụng thư viện phân tích ngày hoặc cuộn giải pháp của riêng bạn. Thursday, 10 Aug 2017 là định dạng không chuẩn và các trình duyệt khác nhau có thể phân tích cú pháp theo cách khác hoặc không phân tích cú pháp. Xem ghi chú trên Date.parse. - Salman A


Cho đến nay, phương pháp đơn giản nhất là trừ một ngày từ một ngày khác và so sánh kết quả.

var oDateOne = new Date();
var oDateTwo = new Date();

alert(oDateOne - oDateTwo === 0);
alert(oDateOne - oDateTwo < 0);
alert(oDateOne - oDateTwo > 0);

63
2017-11-01 00:48





Chỉ so sánh ngày (bỏ qua thành phần thời gian):

Date.prototype.sameDay = function(d) {
  return this.getFullYear() === d.getFullYear()
    && this.getDate() === d.getDate()
    && this.getMonth() === d.getMonth();
}

Sử dụng:

if(date1.sameDay(date2)) {
    // highlight day on calendar or something else clever
}

30
2017-09-27 15:38



Đơn giản và dễ đọc. Ngày tốt nhất (chỉ) so sánh tôi đã thấy - RitchieD
điều này là tốt. nhưng nếu tôi so sánh nextDay hoặc previousDay. tôi đã thử Date.prototype.nextDay = function (d) {return this.getFullYear () === d.getFullYear () && this.getDate () <d.getDate () && this.getMonth () === d .getMonth (); } Date.prototype.previousDay = function (d) {return this.getFullYear () === d.getFullYear () && this.getDate ()> d.getDate () && this.getMonth () === d.getMonth (); } nhưng nó sẽ chỉ hoạt động trong tháng này thôi. làm thế nào để tôi so sánh giữa tháng hoặc qua nhiều năm - Paresh3489227


So sánh ngày trong JavaScript khá dễ dàng ... JavaScript có được xây dựng trong hệ thống so sánh cho ngày làm cho việc so sánh dễ dàng như vậy ...

Chỉ cần làm theo các bước sau để so sánh giá trị 2 ngày, ví dụ: bạn có 2 đầu vào, mỗi giá trị này có giá trị Ngày trong String và bạn so sánh chúng ...

1. bạn có 2 giá trị chuỗi bạn nhận được từ đầu vào và bạn muốn so sánh chúng, chúng như sau:

var date1 = '01/12/2018';
var date2 = '12/12/2018';

2. Họ cần phải Date Object để được so sánh dưới dạng giá trị ngày, vì vậy chỉ cần chuyển đổi chúng thành ngày, sử dụng new Date(), Tôi chỉ định lại chúng cho sự đơn giản của giải thích, nhưng bạn có thể làm điều đó dù sao bạn thích:

date1 = new Date(date1);
date2 = new Date(date2);

3. Bây giờ chỉ cần so sánh chúng, sử dụng >  <  >=  <=

date1 > date2;  //false
date1 < date2;  //true
date1 >= date2; //false
date1 <= date2; //true

compare dates in javascript


28
2017-07-11 09:59



Tôi thấy rằng hầu hết các giải pháp để so sánh ngày làm việc trong bất kỳ trình duyệt nào. Vấn đề tôi gặp phải là với IE. Giải pháp này làm việc trên bảng. Thx Alireza! - Joshua Oglesbee
Nó không hoạt động. Và nó không hoạt động. Bạn đang so sánh đối tượng ngày tháng. - maxisam


định dạng nào?

Nếu bạn xây dựng một Javascript Đối tượng ngày tháng, bạn chỉ có thể trừ chúng để có chênh lệch mili giây (chỉnh sửa: hoặc chỉ so sánh chúng):

js>t1 = new Date()
Thu Jan 29 2009 14:19:28 GMT-0500 (Eastern Standard Time)
js>t2 = new Date()
Thu Jan 29 2009 14:19:31 GMT-0500 (Eastern Standard Time)
js>t2-t1
2672
js>t3 = new Date('2009 Jan 1')
Thu Jan 01 2009 00:00:00 GMT-0500 (Eastern Standard Time)
js>t1-t3
2470768442
js>t1>t3
true

25
2018-01-29 19:19



Trừ là một ý tưởng tốt vì nó tránh được == vấn đề so sánh được đề cập ở trên. - devios1
Bạn đang sử dụng JavaScript REPL nào? - hyde
JSDB - xem jsdb.org - Tôi sử dụng nó thường xuyên hơn những ngày này bây giờ Python là ngôn ngữ của tôi lựa chọn, nhưng nó vẫn là một tiện ích tuyệt vời. - Jason S
Có chuyện gì với jsconsole.com, hoặc ctrl + shift + c hoặc Node? - Stuart P. Bentley
@ StuartP.Bentley Tôi không biết, bởi vì tôi không sử dụng bất kỳ cái nào trong số đó. Tôi sử dụng jsdb. - Jason S


CÂU TRẢ LỜI NGẮN

Đây là một hàm trả về {boolean} nếu từ dateTime> thành dateTime Demo trong hành động

var from = '08/19/2013 00:00'
var to = '08/12/2013 00:00 '

function isFromBiggerThanTo(dtmfrom, dtmto){
   return new Date(dtmfrom).getTime() >=  new Date(dtmto).getTime() ;
}
console.log(isFromBiggerThanTo(from, to)); //true

Giải trình

jsFiddle

var date_one = '2013-07-29 01:50:00',
date_two = '2013-07-29 02:50:00';
//getTime() returns the number of milliseconds since 01.01.1970.
var timeStamp_date_one = new Date(date_one).getTime() ; //1375077000000 
console.log(typeof timeStamp_date_one);//number 
var timeStamp_date_two = new Date(date_two).getTime() ;//1375080600000 
console.log(typeof timeStamp_date_two);//number 

vì bạn hiện đang có cả datetime trong loại số bạn có thể so sánh chúng với bất kỳ hoạt động so sánh nào

(>, <, =,! =, ==,! ==,> = VÀ <=)

Sau đó

nếu bạn đã quen thuộc với C# Chuỗi định dạng ngày và giờ tùy chỉnh Thư viện này phải thực hiện chính xác điều này và giúp bạn định dạng ngày và giờ của mình dtmFRM cho dù bạn đang đi trong chuỗi thời gian ngày hoặc định dạng unix

Sử dụng

var myDateTime = new dtmFRM();

alert(myDateTime.ToString(1375077000000, "MM/dd/yyyy hh:mm:ss ampm"));
//07/29/2013 01:50:00 AM

alert(myDateTime.ToString(1375077000000,"the year is yyyy and the day is dddd"));
//this year is 2013 and the day is Monday

alert(myDateTime.ToString('1/21/2014', "this month is MMMM and the day is dd"));
//this month is january and the day is 21

BẢN GIỚI THIỆU

tất cả những gì bạn phải làm là chuyển bất kỳ định dạng nào được định vị trong thư viện js tập tin


14
2017-08-02 21:06



new Date (dtmfrom)> = new Date (dtmto) chậm hơn nhiều so với ngày mới (dtmfrom) .getTime ()> = new Date (dtmto) .getTime () - Mina Gabriel
Có lẽ, nhưng sự khác biệt là xung quanh 30 đến 120 nano giây (nói 0.000000075 giây) cho mỗi hoạt động, tùy thuộc vào trình duyệt, vì vậy không thực sự quan trọng. - RobG


function datesEqual(a, b)
{
   return (!(a>b || b>a))
}

13
2017-07-20 03:36



Họ là gì loại a hoặc b? Ngày? Định dạng nào? Điều này dường như không làm việc với tôi. - Luci
giả định a và b đang được Date các đối tượng bạn cũng có thể sử dụng return a*1 == b*1; - Udo G
@UdoG: Ngắn hơn: +a == +b - mpen


bạn sử dụng mã này,

var firstValue = "2012-05-12".split('-');
var secondValue = "2014-07-12".split('-');

 var firstDate=new Date();
 firstDate.setFullYear(firstValue[0],(firstValue[1] - 1 ),firstValue[2]);

 var secondDate=new Date();
 secondDate.setFullYear(secondValue[0],(secondValue[1] - 1 ),secondValue[2]);     

  if (firstDate > secondDate)
  {
   alert("First Date  is greater than Second Date");
  }
 else
  {
    alert("Second Date  is greater than First Date");
  }

Và cũng kiểm tra liên kết này http://www.w3schools.com/js/js_obj_date.asp


13
2017-08-09 10:49



Lý do không đề cập đến W3Schools: w3fools.com - giải pháp tốt đẹp mặc dù - là nó tuân thủ các tiêu chuẩn, và nó hoạt động trong tất cả các trình duyệt? - Mathias Lykkegaard Lorenzen
Tốt hơn hãy tham khảo Mạng nhà phát triển Mozilla: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…. - Daniel Lidström