Kiểm tra xem hai Ngày có thông tin ngày giống nhau không


82

Làm cách nào để kiểm tra xem hai đối tượng ngày tháng khác nhau có cùng thông tin ngày tháng (có cùng ngày, tháng, năm ...) hay không? Tôi đã thử "==", "===" và .equals nhưng dường như không có tác dụng nào.

Câu trả lời:


136

Bạn có thể sử dụng valueOf()hoặc getTime():

a = new Date(1995,11,17);
b = new Date(1995,11,17);

a.getTime() === b.getTime() // prints true

18
Bởi vì trong trường hợp >=các giá trị được chuyển đổi thành số. Trong trường hợp ==các đối tượng được so sánh chính nó (và chỉ a == ađúng).
Felix Kling

8
Chỉ cần chỉ ra rằng giải pháp này đòi hỏi rằng ngày chỉ bao gồm các bộ phận ngày, trong khi rất nhiều người đến câu hỏi này có thể có những yêu cầu khác nhau ( ví dụ với phần thời gian trong jsFiddle )
KyleMit

1
Vì vậy, khi sử dụng này hãy chắc chắn phần thời gian được thiết lập để 0 nhờ vào các setHours chức năng :a.setHours(0,0,0,0);
Coil

Điều này sẽ không hoạt động nếu có bất kỳ sự khác biệt nào về mili giây. Vì getTime()trả về thời gian tính bằng mili giây, nên cả hai thời gian cũng có thể có sự khác biệt về mili giây. Trong giải pháp này, nó sẽ không hoạt động như mong đợi. Hãy thử sử dụngtoDateString()
Rehan Sattar

41

Nếu bạn chỉ quan tâm đến việc kiểm tra xem các ngày có xảy ra trong cùng một ngày bất kể thời gian hay không thì bạn có thể sử dụng toDateString() phương pháp để so sánh. Phương thức này chỉ trả về ngày mà không có thời gian:

var start = new Date('2015-01-28T10:00:00Z');
var end = new Date('2015-01-28T18:00:00Z');

if (start.toDateString() === end.toDateString()) {
  // Same day - maybe different times
} else {
  // Different day
}

39

Tôi đã sử dụng mã này:

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

Sau đó, bạn chỉ cần gọi nó như: if (aDate.isSameDateAs(otherDate)) { ... }


Tại sao bạn phải chạy hàng tá hàm khi bạn có thể sử dụng getTime () chỉ hai lần? Ồ, bạn có nghĩ đến việc bỏ qua sự khác biệt về giờ, tháng và năm không? Trong trường hợp đó, có thể cân nhắc múi giờ bắt đầu quan trọng?
ErikE

12
Bởi vì câu hỏi là "hai đối tượng ngày tháng khác nhau có cùng thông tin ngày tháng" và mã này thực hiện điều đó: so sánh ngày tháng bất kể thời gian
Sự cố

2
ờ, tôi muốn nói "bỏ qua sự khác biệt về giờ, phút và giây"
ErikE

14

Nhập chuyển đổi thành số nguyên:

a = new Date(1995,11,17);
b = new Date(1995,11,17);
+a === +b;  //true

4
cách sử dụng tuyệt vời của toán tử Unary
KingOfHypocrites

6

Hellnar,

bạn có thể thử (xin thứ lỗi cho tên hàm :) - được sửa đổi theo giá trị của felix, thay vì getTime)

function isEqual(startDate, endDate) {
    return endDate.valueOf() == startDate.valueOf();
}

sử dụng:

if(isEqual(date1, date2)){
   // do something
}

có thể giúp bạn một phần của con đường đến đó.

Xem thêm:

'http://www.java2s.com/Tutorial/JavaScript/0240__Date/DatevalueOf.htm'


4

Đối với sử dụng tốt hơn hỗ trợ ngày moment.jsisSame phương pháp

var starDate = moment('2018-03-06').startOf('day');
var endDate  = moment('2018-04-06').startOf('day');

console.log(starDate.isSame(endDate)); // false ( month is different )

var starDate = moment('2018-03-06').startOf('day');
var endDate  = moment('2018-03-06').startOf('day');

console.log(starDate.isSame(endDate)); // true ( year, month and day are the same )

3

trừ chúng và so sánh với 0:

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

// làm gì đó với ngày ...

(date1 - date2) ? alert("not equal") : alert("equal");

để đặt nó vào một biến:

var datesAreSame = !(date1 - date2);

3

Một phương án thay thế một dòng đơn giản để xác định xem hai ngày có bằng nhau hay không, bỏ qua phần thời gian:

function isSameDate(a, b) {
    return Math.abs(a - b) < (1000 * 3600 * 24) && a.getDay() === b.getDay();
}

Nó xác định xem ngày a và b có chênh lệch nhau không quá một ngày và có cùng ngày trong tuần hay không.

function isSameDate(a, b) {
    return Math.abs(a - b) < (1000 * 3600 * 24) && a.getDay() === b.getDay();
}

console.log(isSameDate(new Date(2017, 7, 21), new Date(2017, 7, 21))); //exact same date => true
console.log(isSameDate(new Date(2017, 7, 21, 23, 59, 59), new Date(2017, 7, 21))); //furthest same dates => true
console.log(isSameDate(new Date(2017, 7, 20, 23, 59, 59), new Date(2017, 7, 21))); //nearest different dates => false
console.log(isSameDate(new Date(2016, 7, 21), new Date(2017, 7, 21))); //different year => false
console.log(isSameDate(new Date(2017, 8, 21), new Date(2017, 7, 21))); //different month => false

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.