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:
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):
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()); // true3. 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):
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:
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:
// 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)); // falseBảng tổng hợp phương pháp so sánh
| Phương pháp | Ưu điểm | Nhược điểm |
|---|---|---|
Dùng getTime() | Chính xác, dễ hiểu | Phải gọi thêm hàm |
| So sánh trực tiếp Date | Ngắn gọn | Không chính xác (tránh dùng) |
| Bỏ qua thời gian | Tập trung vào ngày | Cần reset giờ/phút |
| Thư viện (date-fns) | Mạnh mẽ, nhiều tính năng | Cần cài đặt |
Kết luận
- ✅ Nên dùng:
getTime()hoặcvalueOf()để 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ế:
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";
}







