Làm việc với ngày tháng là một trong những thao tác phổ biến nhưng dễ gây rối trong lập trình frontend. Trong JavaScript, việc so sánh 2 ngày tưởng đơn giản nhưng nếu không cẩn thận, bạn có thể so sánh sai do chênh lệch thời gian, múi giờ, hoặc định dạng không đồng nhất.

Bài viết này sẽ hướng dẫn bạn các cách so sánh ngày trong JavaScript: từ cơ bản đến nâng cao, kèm ví dụ minh họa dễ hiểu.

1. So sánh 2 ngày bằng giá trị timestamp

JavaScript lưu trữ ngày tháng dưới dạng timestamp (số mili giây từ 1/1/1970), nên ta có thể so sánh trực tiếp:

js
const date1 = new Date('2024-05-20');
const date2 = new Date('2024-05-25');

// So sánh timestamp (getTime())
if (date1.getTime() === date2.getTime()) {
  console.log("Hai ngày GIỐNG NHAU");
} else if (date1.getTime() > date2.getTime()) {
  console.log("date1 SAU date2");
} else {
  console.log("date1 TRƯỚC date2");
}

Giải thích:

  • getTime() trả về timestamp (miligiây).
  • So sánh ><=== như số bình thường.

2. So sánh trực tiếp với đối tượng Date

Bạn có thể so sánh trực tiếp mà không cần getTime() (nhưng không nên dùng vì dễ sai):

js
const date1 = new Date('2024-05-20');
const date2 = new Date('2024-05-20');

// ❌ Không nên dùng (có thể sai trong một số trình duyệt)
console.log(date1 == date2); // false (vì so sánh tham chiếu object)
console.log(date1 === date2); // false

// ✅ Nên dùng timestamp hoặc giá trị chuỗi
console.log(date1.getTime() === date2.getTime()); // true

3. So sánh ngày (bỏ qua thời gian)

Nếu chỉ muốn so sánh ngày/tháng/năm (không quan tâm giờ/phút/giây):

js
const date1 = new Date('2024-05-20T10:00:00');
const date2 = new Date('2024-05-20T15:30:00');

// Chuyển về cùng ngày (set giờ về 0)
date1.setHours(0, 0, 0, 0);
date2.setHours(0, 0, 0, 0);

if (date1.getTime() === date2.getTime()) {
  console.log("CÙNG NGÀY");
} else {
  console.log("KHÁC NGÀY");
}

4. Kiểm tra ngày hợp lệ trước khi so sánh

Luôn kiểm tra ngày có hợp lệ không để tránh lỗi:

js
function isValidDate(date) {
  return date instanceof Date && !isNaN(date);
}

const date1 = new Date('2024-05-20');
const date2 = new Date('Invalid Date');

if (!isValidDate(date1) || !isValidDate(date2)) {
  console.log("Một trong các ngày KHÔNG HỢP LỆ");
} else {
  // Tiến hành so sánh...
}

5. So sánh với thư viện bên ngoài (Moment.js, date-fns)

Nếu dự án phức tạp, nên dùng thư viện như date-fns hoặc Moment.js:

js
// Dùng date-fns
import { compareAsc, isEqual } from 'date-fns';

const date1 = new Date('2024-05-20');
const date2 = new Date('2024-05-25');

console.log(compareAsc(date1, date2)); // -1 (date1 < date2)
console.log(isEqual(date1, date2)); // false

Bảng tổng hợp phương pháp so sánh

Phương phápƯu điểmNhược điểm
Dùng getTime()Chính xác, dễ hiểuPhải gọi thêm hàm
So sánh trực tiếp DateNgắn gọnKhông chính xác (tránh dùng)
Bỏ qua thời gianTập trung vào ngàyCần reset giờ/phút
Thư viện (date-fns)Mạnh mẽ, nhiều tính năngCần cài đặt

Kết luận

  • ✅ Nên dùnggetTime() hoặc valueOf() để so sánh timestamp.
  • ❌ Không nên: So sánh trực tiếp date1 == date2 (sai vì so sánh object).
  • 🔧 Kiểm tra ngày hợp lệ trước khi so sánh.

Ví dụ thực tế:

js
function compareDates(date1, date2) {
  if (!isValidDate(date1) || !isValidDate(date2)) return "Invalid Date";
  
  const time1 = date1.getTime();
  const time2 = date2.getTime();
  
  return time1 === time2 ? "Bằng nhau" : time1 > time2 ? "date1 lớn hơn" : "date1 nhỏ hơn";
}