2011-09-30 62 views
61

Khi so sánh các đối tượng ngày trong Javascript tôi thấy rằng thậm chí so sánh cùng một ngày không trả lại đúng sự thật.So sánh đối tượng ngày JavaScript

var startDate1 = new Date("02/10/2012"); 
var startDate2 = new Date("01/10/2012"); 
var startDate3 = new Date("01/10/2012"); 
alert(startDate1>startDate2); // true 
alert(startDate2==startDate3); //false 

Làm cách nào để so sánh sự bình đẳng của những ngày này? Tôi quan tâm đến việc sử dụng đối tượng Date gốc của JS và không phải bất kỳ thư viện của bên thứ ba nào vì nó không thích hợp để sử dụng JS của bên thứ ba chỉ để so sánh các ngày tháng.

+8

ví dụ tuyệt vời về cách này được thiết kế kém trong JavaScript. – devios1

Trả lời

96

Đó là vì trong trường hợp thứ hai, các đối tượng ngày thực tế được so sánh và hai đối tượng không bao giờ bằng nhau. Ép buộc họ số:

alert(+startDate2 == +startDate3); // true 

Nếu bạn muốn có một chuyển đổi explicity hơn để số, sử dụng một trong hai:

alert(startDate2.getTime() == startDate3.getTime()); // true 

hoặc

alert(Number(startDate2) == Number(startDate3)); // true 

Oh, một tham chiếu đến spec: §11.9 .3 The Abstract Equality Comparison Algorithm mà về cơ bản nói khi so sánh các đối tượng, obj1 == obj2 là đúng chỉ khi chúng đề cập đến cùng một đối tượng, nếu không kết quả là sai.

+0

Tôi đang trả lời upped, nhưng là đúng cách để sử dụng _strict equals_ operator '===' trong ví dụ của bạn? –

+5

@AndrewD. bằng cách sử dụng mức tương đương nghiêm ngặt trong trường hợp cụ thể này không tạo ra bất kỳ sự khác biệt nào về kết quả, điều này là do toán tử equals trong các ví dụ, luôn xử lý các toán hạng cùng loại, @RobG đang chuyển đổi các giá trị thành Số (ví dụ 1 và 3) hoặc trong ví dụ 2, chúng ta biết rằng 'Date.prototype.getTime' sẽ luôn trả về một số ... – CMS

+0

@RobG: Khi bạn nói" 'obj1 == obj2' là đúng chỉ khi chúng tham chiếu đến cùng một đối tượng ", điều đó có nghĩa là so sánh (nếu cả hai toán hạng là các đối tượng) không kiểm tra tính bình đẳng, mà là sự nhận dạng? Sự hiểu biết của tôi về điều này có đúng không? –

16

So sánh ngày sử dụng getTime() số mili giây từ thời đại (tức là một số) trở về:

var startDate1 = new Date("02/10/2012"); 
var startDate2 = new Date("01/10/2012"); 
var startDate3 = new Date("01/10/2012"); 
alert(startDate1.getTime() > startDate2.getTime()); // true 
alert(startDate2.getTime() == startDate3.getTime()); //true 

Cũng xem xét sử dụng Date constructor dùng rõ ràng năm/tháng/số ngày thay vì sau đó dựa vào chuỗi đại diện (xem: Date.parse()). Và hãy nhớ rằng ngày trong JavaScript luôn được biểu diễn bằng múi giờ của khách hàng (trình duyệt).

+1

+1 cho nhận xét về việc sử dụng chuỗi làm đối số cho Date(). – RobG

4

bạn có thể so sánh mili giây thực tế:

alert(startDate2.getTime() === startDate3.getTime()); 
6

Bạn không cần phải sử dụng các phương pháp luận getTime bạn có thể trừ một đối tượng ngày từ một đối tượng ngày. Nó sẽ trả lại phần chênh lệch mili giây (tiêu cực, nếu thứ hai là một ngày sau đó)

var startDate1 = new Date("02/10/2012"); 
var startDate2 = new Date("01/10/2012"); 

var diff= (startDate1 -startDate2) 

// đánh giá là 0 nếu ngày có cùng timestamp

+0

+1 giải pháp đơn giản và thanh lịch, được ưa chuộng: điều này sử dụng chức năng đánh giá Ngày được xây dựng sẵn mà không cần phải ép buộc vào dấu thời gian số – gdibble