Many applications you build will have some sort of a date component, whether it's the creation date of a resource, or the timestamp of an activity.

Dealing with date and timestamp formatting can be exhausting. In this guide, you will learn how to get the current date in various formats in JavaScript.

JavaScript's Date Object

JavaScript has a built-in Date object that stores the date and time and provides methods for handling them.

To create a new instance of the Date object, use the new keyword:

const date = new Date();

The Date object contains a Number that represents milliseconds passed since the Epoch, that is 1 January 1970.

You can pass a date string to the Date constructor to create an object for the specified date:

const date = new Date('Jul 12 2011');

To get the current year, use the getFullYear() instance method of the Date object. The getFullYear() method returns the year of the specified date in the Date constructor:

const currentYear = date.getFullYear();
console.log(currentYear); //2020

Similarly, there are methods for getting the current day of the month and the current month:

const today = date.getDate();
const currentMonth = date.getMonth() + 1; 

The getDate() method returns the current day of the month (1-31).

The getMonth() method returns the month of the specified date. One point to note about the getMonth() method is that it returns 0-indexed values (0-11) where 0 is for January and 11 for December. Hence the addition of 1 to normalize the month's value.

Date now

now() is a static method of the Date object. It returns the value in milliseconds that represents the time elapsed since the Epoch. You can pass in the milliseconds returned from the now() method into the Date constructor to instantiate a new Date object:

const timeElapsed = Date.now();
const today = new Date(timeElapsed);

Formatting The Date

You can format the date into multiple formats (GMT, ISO, and so on) using the methods of the Date object.

The toDateString() method returns the date in a human readable format:

today.toDateString(); // "Sun Jun 14 2020"

The toISOString() method returns the date which follows the ISO 8601 Extended Format:

today.toISOString(); // "2020-06-13T18:30:00.000Z"

The toUTCString() method returns the date in UTC timezone format:

today.toUTCString(); // "Sat, 13 Jun 2020 18:30:00 GMT"

The toLocaleDateString() method returns the date in a locality-sensitive format:

today.toLocaleDateString(); // "6/14/2020"

You can find the complete reference for the Date methods in the MDN documentation.

Custom Date Formatter Function

Apart from the formats mentioned in the above section, your application might have a different format for data. It could be in yy/dd/mm or yyyy-dd-mm format, or something similar.

To tackle this problem, it would be better to create a reusable function so that it can be used across multiple projects.

So in this section, let's create a utility function that will return the date in the format specified in the function argument:

const today = new Date();

function formatDate(date, format) {
	//
}

formatDate(today, 'mm/dd/yy');

You need to replace the strings "mm", "dd", "yy" with the respective month, day and year values from the format string passed in the argument.

To do that you can use the replace() method like shown below:

format.replace('mm', date.getMonth() + 1);

But this will lead to a lot of method chaining and make it difficult to maintain as you try to make the function more flexible:

format.replace('mm', date.getMonth() + 1)
    .replace('yy', date.getFullYear())
	.replace('dd', date.getDate());

Instead of chaining methods, you can make use of regular expression with the replace() method.

First create an object that will represent a key-value pair of the substring and its respective value:

const formatMap = {
	mm: date.getMonth() + 1,
    dd: date.getDate(),
    yy: date.getFullYear().toString().slice(-2),
    yyyy: date.getFullYear()
};

Next, use regular expression to match and replace the strings:

formattedDate = format.replace(/mm|dd|yy|yyy/gi, matched => map[matched]);

The complete function looks like this:

function formatDate(date, format) {
    const map = {
        mm: date.getMonth() + 1,
        dd: date.getDate(),
        yy: date.getFullYear().toString().slice(-2),
        yyyy: date.getFullYear()
    }

    return format.replace(/mm|dd|yy|yyy/gi, matched => map[matched])
}

You can also add the ability to format timestamps in the function.

Conclusion

I hope you now have a better understanding of the Date object in JavaScript. You can also use other third-party libraries like datesj and moment to handle dates in your application.

Until next time, stay safe and keep hustling.