Skip to content Skip to footer

Snagging the Last Day of the Month in JavaScript: A Deep Dive

Hey there, fellow code wranglers! Ever found yourself in a situation where you needed to figure out the last day of a given month with JavaScript? Well, you’re in luck because that’s exactly what we’re diving into today. We’ll explore different ways to achieve this, from vanilla JS to some of the coolest libraries out there. So, buckle up and let’s get coding!

Vanilla JavaScript – Keepin’ It Simple

Alright, let’s kick things off with good ol’ vanilla JavaScript. No fancy frameworks or libraries, just straight-up, plain JavaScript to get the job done. Here’s how you can calculate the last day of the month:

function getLastDayOfMonth(year, month) {
  return new Date(year, month + 1, 0).getDate();
}

// Usage
const year = 2023;
const month = 4; // May (remember, months are zero-indexed in JS!)
const lastDay = getLastDayOfMonth(year, month);
console.log(`The last day of the month is: ${lastDay}`);

The magic here lies in the Date constructor. By setting the day parameter to 0, we’re actually asking for the day before the first day of the next month, which, as you’ve probably guessed, is the last day of the current month. Neat, huh?

Moment.js – Time Travel Made Easy

Now, let’s jazz things up a bit with Moment.js, a fan-favorite library for managing and manipulating dates and times in JavaScript. If you haven’t already added Moment.js to your project, you can do so with a quick trip to their GitHub repo or by running npm install moment.

Once you’ve got Moment.js in your toolkit, snagging the last day of the month is a breeze:

const moment = require('moment');

function getLastDayOfMonthMoment(year, month) {
  return moment([year, month]).endOf('month').format('YYYY-MM-DD');
}

// Usage
const year = 2023;
const month = 4; // May
const lastDayMoment = getLastDayOfMonthMoment(year, month);
console.log(`With Moment.js, the last day of the month is: ${lastDayMoment}`);

With endOf('month'), Moment.js does all the heavy lifting, giving us the last moment of the month. We then format it to a more human-readable date string. It’s like having a time machine, but without all the paradoxes!

Date-fns – Modern JavaScript Date Utility

If you’re all about modern JavaScript, then you might want to take a gander at date-fns, a modular date utility library. It’s like lodash for dates! You can install it via npm or by adding it directly to your project from their GitHub.

Using date-fns, we can get the last day of the month with a function that’s as clear as a sunny day:

const dateFns = require('date-fns');

function getLastDayOfMonthDateFns(year, month) {
  return dateFns.lastDayOfMonth(new Date(year, month)).getDate();
}

// Usage
const year = 2023;
const month = 4; // May
const lastDayDateFns = getLastDayOfMonthDateFns(year, month);
console.log(`With date-fns, the last day of the month is: ${lastDayDateFns}`);

And just like that, lastDayOfMonth gives us a date object set to the last day, and we use getDate() to extract the day number. It’s like having a Swiss Army knife for your date-related conundrums.

Luxon – A Powerful, Modern Library

Last but not least, let’s talk about Luxon, a powerful library for working with dates and times that’s built by the creators of Moment.js. Luxon is designed to be more powerful and modern. You can get it via npm or from their GitHub page.

Here’s how to wield Luxon to get the last day of any month:

const { DateTime } = require('luxon');

function getLastDayOfMonthLuxon(year, month) {
  return DateTime.local(year, month + 1).minus({ days: 1 }).toFormat('yyyy-MM-dd');
}

// Usage
const year = 2023;
const month = 4; // May
const lastDayLuxon = getLastDayOfMonthLuxon(year, month);
console.log(`With Luxon, the last day of the month is: ${lastDayLuxon}`);

By calling DateTime.local() with the next month and then chaining minus({ days: 1 }), we step back one day into the last day of the intended month. And toFormat()? Well, that’s just Luxon’s way of making the date look pretty for us humans.


So far, we’ve covered the basics and then some! We’ve seen how to tackle the problem with vanilla JS and how to use some of the most popular date manipulation libraries out there. Each one has its own flavor and style, so pick the one that suits your taste (and project requirements) the best. Stay tuned for the second half of this article, where we’ll delve into more advanced scenarios and some pro tips to make your developer life even easier.

Advanced Scenarios and Pro Tips

Now that we’ve covered the basics, let’s step up our game and explore some advanced scenarios. Whether you’re dealing with timezone complexities or need to handle edge cases, these pro tips will help you navigate the intricacies of date manipulation like a seasoned pro.

Timezones and the Last Day of the Month

Timezones can be a real headache when dealing with dates. You might need to find the last day of the month for a specific timezone. Here’s how you can handle it with Luxon, which has excellent support for timezones:

const { DateTime } = require('luxon');

function getLastDayOfMonthTimezone(year, month, timezone) {
  return DateTime.local(year, month + 1)
    .setZone(timezone)
    .minus({ days: 1 })
    .toFormat('yyyy-MM-dd');
}

// Usage
const year = 2023;
const month = 4; // May
const timezone = 'America/New_York';
const lastDayTimezone = getLastDayOfMonthTimezone(year, month, timezone);
console.log(`With timezone support, the last day of the month is: ${lastDayTimezone}`);

Luxon’s setZone() method allows you to specify the timezone, ensuring that you’re getting the last day of the month in the correct locale.

Handling Leap Years

Leap years can throw a wrench in your calculations if you’re not careful. However, the methods we’ve discussed automatically take leap years into account. For instance, here’s how you could verify the last day of February in a leap year with vanilla JavaScript:

const leapYear = 2024;
const february = 1; // February
const lastDayFebruary = getLastDayOfMonth(leapYear, february);
console.log(`In a leap year, the last day of February is: ${lastDayFebruary}`);

This will correctly return 29, as February has an extra day in a leap year.

Performance Considerations

When it comes to performance, vanilla JavaScript is generally the fastest since it doesn’t require the overhead of additional libraries. However, if you’re already using a date library elsewhere in your project, it’s typically more efficient to stick with that library for consistency and to take advantage of its caching mechanisms.

Testing Your Date Logic

Testing is crucial, especially when it comes to date logic. Make sure to write tests for different edge cases, including:

  • The last day of months with 30 and 31 days
  • February in a standard year vs. a leap year
  • Timezone-specific tests if your application is timezone-aware

Here’s a simple example of a test you might write using Jest for our vanilla JavaScript function:

test('getLastDayOfMonth returns the correct last day', () => {
  expect(getLastDayOfMonth(2023, 0)).toBe(31); // January
  expect(getLastDayOfMonth(2023, 1)).toBe(28); // February
  expect(getLastDayOfMonth(2024, 1)).toBe(29); // February in a leap year
});

Going Beyond: Custom Utility Functions

Sometimes, you might need a custom utility function that goes beyond just getting the last day of the month. For example, you might need to find the last weekday of the month. Here’s a quick example of how you could implement such a function in vanilla JavaScript:

function getLastWeekdayOfMonth(year, month) {
  let lastDay = new Date(year, month + 1, 0);
  while (lastDay.getDay() === 0 || lastDay.getDay() === 6) {
    lastDay.setDate(lastDay.getDate() - 1);
  }
  return lastDay.getDate();
}

// Usage
const year = 2023;
const month = 4; // May
const lastWeekday = getLastWeekdayOfMonth(year, month);
console.log(`The last weekday of the month is: ${lastWeekday}`);

This function looks for the last day of the month and then steps backward until it finds a weekday.


And there you have it, folks – the full scoop on getting the last day of the month in JavaScript, along with some advanced tips and tricks to keep up your sleeve. Whether you’re sticking with vanilla JavaScript or leveraging the power of libraries like Moment.js, date-fns, or Luxon, you’re now equipped to handle this common but sometimes tricky task. Remember, the right tool for the job will depend on your specific needs and the context of your project. Happy coding, and may your dates always be accurate!