Skip to main content

How to Convert Between Month Number and Month Name in JavaScript

A common requirement in UI development is to display the name of a month (e.g., "January") instead of its number (1), or vice versa. While you could create a manual mapping with an array or object, JavaScript's built-in Intl (Internationalization) API provides a powerful, locale-aware, and modern solution for this.

This guide will teach you how to use the Intl.DateTimeFormat object to convert a month number to its name and how to parse a month name to get its number. This is the recommended approach for creating applications that can be easily adapted to different languages and regions.

The Modern Method: Intl.DateTimeFormat

The Intl.DateTimeFormat object is the standard, built-in tool for language-sensitive date and time formatting. It is the best choice for this task because it handles different languages and formatting conventions automatically, without requiring any manual translation or mapping.

Converting a Month Number to a Month Name

Problem: you have a month number (e.g., 1 for January) and you need to get its full name.

Solution: the logic is to create a Date object for that month and then use Intl.DateTimeFormat to format it, showing only the month's name.

function getMonthName(monthNumber) {
// Create a date in the middle of the month
// to avoid timezone issues. The month in the Date
// constructor is 0-based, so we subtract 1.
const date = new Date(2000, monthNumber - 1, 15);

const formatter = new Intl.DateTimeFormat('en-US', {
month: 'long',
});

return formatter.format(date);
}

// Example Usage:
console.log(getMonthName(1)); // Output: "January"
console.log(getMonthName(12)); // Output: "December"
note

A simpler but less flexible alternative is date.toLocaleString('en-US', { month: 'long' }), which uses the Intl API under the hood.

How to Get Different Name Formats (long, short, narrow)

The Intl.DateTimeFormat API is highly configurable. You can get different versions of the month name by changing the month option.

const date = new Date(2023, 0, 15); // A date in January

// 'long' format
const longFormatter = new Intl.DateTimeFormat('en-US', { month: 'long' });
console.log(longFormatter.format(date)); // Output: "January"

// 'short' format
const shortFormatter = new Intl.DateTimeFormat('en-US', { month: 'short' });
console.log(shortFormatter.format(date)); // Output: "Jan"

// 'narrow' format
const narrowFormatter = new Intl.DateTimeFormat('en-US', { month: 'narrow' });
console.log(narrowFormatter.format(date)); // Output: "J"
note

The narrow format should be used with caution, as different months can have the same initial (e.g., January, June, July).

Converting a Month Name to a Month Number

The reverse operation—getting a number from a name—is also straightforward.

Problem: you have a month name (e.g., "January") and need its corresponding 1-based number.

Solution: create a Date object by parsing a string that includes the month name, then use the .getMonth() method.

function getMonthNumber(monthName) {
// Create a date object by parsing the name.
// The '1' and '2000' are arbitrary but necessary for a valid date string.
const date = new "Date"(`${monthName} 1, 2000`);

// getMonth() returns a 0-based index, so add 1.
return date.getMonth() + 1;
}

// Example Usage:
console.log(getMonthNumber('January')); // Output: 1
console.log(getMonthNumber('Jan')); // Output: 1
console.log(getMonthNumber('December')); // Output: 12
note

The Date constructor is surprisingly flexible and can parse both full month names and standard 3-letter abbreviations.

An Alternative (Less Flexible) Method: An Object Map

For applications that only ever operate in a single language, a simple object map can be a quick solution.

const monthNameToNumber = {
'January': 1, 'February': 2, 'March': 3, 'April': 4,
'May': 5, 'June': 6, 'July': 7, 'August': 8,
'September': 9, 'October': 10, 'November': 11, 'December': 12,
};

const monthName = 'August';
const monthNumber = monthNameToNumber[monthName];

console.log(monthNumber); // Output: 8
note

The main drawback of this method is that it is not locale-aware. It only works for English and must be manually translated and maintained for other languages, which is why the Intl.DateTimeFormat approach is the superior, professional choice.

Conclusion

Converting between month numbers and names is a solved problem in modern JavaScript thanks to the built-in Internationalization API.

  • To convert a month number to a name, use Intl.DateTimeFormat with the { month: 'long' } option. This is the recommended best practice for its flexibility and locale-awareness.
  • To convert a month name to a number, parse the name with the new Date() constructor and then use .getMonth() + 1.
  • Avoid using manual object maps unless your application is guaranteed to only ever support a single language.