Javascript kiểm tra xem hôm nay có phải là ngày cuối cùng của tháng không

Cách đơn giản nhất để kiểm tra xem một ngày có phải là ngày cuối cùng của tháng hay không bằng cách thêm 1 vào ngày và sau đó kiểm tra giá trị của ngày. Nếu ngày trở thành 1, thì ngày đã cho là ngày cuối cùng của tháng;

let d1 = new Date('2020-02-29');
d1.setDate(d1.getDate() + 1);
if(d1.getDate() === 1){
  console.log('Date d1 is the last day of the month.');
}else{
  console.log('Date d1 is not the last day of the month.');
}

let d2 = new Date('2022-03-30');
d2.setDate(d1.getDate() + 1);
if(d2.getDate() === 1){
  console.log('Date d2 is the last day of the month.');
}else{
  console.log('Date d2 is not the last day of the month.');
}

đầu ra

Date d1 is the last day of the month.
Date d2 is not the last day of the month.

Trong ví dụ này, hai đối tượng Date được tạo. Đối tượng Ngày đầu tiên d1 đại diện cho ngày 29 tháng 2 năm 2020. Vì là ngày cuối cùng của tháng nên thêm 1 ngày nữa là ngày 1 tháng 3

Mặt khác, đối tượng Date thứ hai d2 đại diện cho ngày 30 tháng 3. Bạn biết rằng tháng 3 có 31 ngày và đối tượng ngày này không phải là ngày cuối cùng của tháng, vì vậy thêm 1 ngày vào đó sẽ có ngày 31 tháng 3

Thật dễ dàng để có được ngày đầu tiên của tháng nhưng còn ngày cuối cùng của tháng thì sao?

Trong suốt bài đăng này, hãy nhớ rằng trong JavaScript, số tháng của Ngày không được lập chỉ mục - vì vậy tháng 1 là tháng 0 và tháng 12 là tháng 11 🙄 – đó là điều tôi thường quên

Hóa ra cách lấy ngày cuối cùng của tháng là hỏi ngày trước ngày đầu tiên của tháng tiếp theo. Tôi đặc biệt thích cách diễn đạt đó vì nó vừa là mô tả cho con người vừa là giải thích mã. Đây là một ví dụ

const month = 5 // June.

const startOfMonth = new Date(2019, month, 1)
// Sat Jun 01 2019...

const endOfMonth = new Date(2019, month + 1, 0)
// Sun Jun 30 2019...

Rõ ràng số không là ngày trước ngày đầu tiên của một tháng?. Và số 0 không phải là trường hợp đặc biệt, bạn có thể tiếp tục đếm ngược

new Date(2019, 6, 1)
// Mon Jul 01 2019...

new Date(2019, 6, 0)
// Sun Jun 30 2019...

new Date(2019, 6, -1)
// Sat Jun 29 2019...

// Keep going...

new Date(2019, 6, -364)
// Sun Jul 01 2018...

Nó cũng hoạt động với các tháng và qua các năm

new Date(2019, 11)
// Sun Dec 01 2019...

new Date(2019, 12) // ¿December + 1?
// Wed Jan 01 2020...

Cả hai có thể được kết hợp để có được ngày cuối cùng của năm bằng cách yêu cầu ngày thứ 0 của tháng thứ mười ba (nhớ rằng nó không được lập chỉ mục, vì vậy tháng là số 12)

new Date(2019, 12, 0)
// Tue Dec 31 2019...

Hay giây cuối cùng trước thềm năm mới

new Date(2019, 12, 0, 24, 0, -1)
// Tue Dec 31 2019 23:59:59 GMT+0000 (Greenwich Mean Time)

Và đó là hành vi tương tự khi bạn thay đổi một đối tượng ngày tháng - nó thực hiện một cách thông minh khi ghi để nó đọc lại bình thường

const date = new Date(2019, 6)
// Mon Jul 01 2019...

date.setMonth(12)
// Wed Jan 01 2020...

date.getFullYear()
// 2020

date.getMonth()
// 0

Thoạt đầu, nó có vẻ hơi kỳ lạ nhưng lại hoạt động hoàn toàn nhất quán — như được mô tả trong thông số kỹ thuật (thậm chí là bản đầu tiên từ năm 1997) — và thân thiện với nhà phát triển một cách khác thường (đặc biệt là so với sự cố tháng không được lập chỉ mục), tôi không thể tin rằng mình đã không làm như vậy