Formatting Dates with Moment.js
Moment.js is a popular JavaScript library for parsing, validating, manipulating, and formatting dates. It simplifies working with dates and times in JavaScript, which can often be cumbersome due to the inherent complexities of date handling. This tutorial will guide you through the basics of formatting dates using Moment.js, allowing you to display dates in a variety of human-readable formats.
Installation
Before you begin, you need to include Moment.js in your project. You can do this in a few ways:
-
Download: Download the Moment.js library from the official website (https://momentjs.com/) and include the script tag in your HTML file.
-
CDN: Use a Content Delivery Network (CDN) to include Moment.js directly in your HTML. This is a quick and easy way to get started. For example:
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script>
-
npm or Yarn: If you’re using a package manager like npm or Yarn, you can install Moment.js as a dependency in your project:
npm install moment # or yarn add moment
Creating Moment Objects
Before you can format a date, you need to create a Moment object. Moment.js provides several ways to create these objects:
-
From a string: You can create a Moment object from a date string. Moment.js will attempt to parse the string based on common date formats.
var dateString = "Fri Apr 12 2013 19:08:55 GMT-0500 (CDT)"; var momentDate = moment(dateString); console.log(momentDate);
-
From a timestamp: You can create a Moment object from a Unix timestamp (milliseconds since the epoch).
var timestamp = 1678886400000; // Example timestamp var momentDate = moment(timestamp); console.log(momentDate);
-
From a JavaScript Date object: You can create a Moment object from an existing JavaScript
Date
object.var jsDate = new Date(); var momentDate = moment(jsDate); console.log(momentDate);
Formatting Dates
The core of Moment.js lies in its formatting capabilities. The format()
method allows you to display a Moment object in a specific format using a variety of formatting tokens.
var momentDate = moment("2023-03-15");
// Format as MM/DD/YYYY
var formattedDate1 = momentDate.format("MM/DD/YYYY");
console.log(formattedDate1); // Output: 03/15/2023
// Format as DD-MMM-YYYY
var formattedDate2 = momentDate.format("DD-MMM-YYYY");
console.log(formattedDate2); // Output: 15-Mar-2023
// Format as dddd, MMMM Do YYYY, h:mm:ss a
var formattedDate3 = momentDate.format("dddd, MMMM Do YYYY, h:mm:ss a");
console.log(formattedDate3); // Output: Wednesday, March 15th 2023, 12:00:00 am (or pm)
Here’s a breakdown of some common formatting tokens:
YYYY
: Four-digit yearYY
: Two-digit yearMMMM
: Full month name (e.g., January)MMM
: Abbreviated month name (e.g., Jan)MM
: Two-digit month (01-12)M
: Month (1-12)DD
: Two-digit day of the month (01-31)D
: Day of the month (1-31)dddd
: Full day of the week (e.g., Wednesday)ddd
: Abbreviated day of the week (e.g., Wed)hh
: Two-digit hour (00-23)h
: Hour (1-12)mm
: Two-digit minute (00-59)ss
: Two-digit second (00-59)a
: am/pm
You can combine these tokens to create virtually any date format you need.
Parsing Dates with a Format
While Moment.js can often infer the date format from a string, you can explicitly specify the input format using the second argument to the moment()
constructor. This is especially useful when dealing with dates in non-standard formats.
var dateString = "12/25/2023";
var momentDate = moment(dateString, "MM/DD/YYYY");
console.log(momentDate.format("YYYY-MM-DD")); // Output: 2023-12-25
Important Considerations
- Case Sensitivity: Formatting tokens are case-sensitive.
MM
represents the month, whilemm
represents the minute. - Localization: Moment.js supports localization, allowing you to display dates in different languages and formats.
Alternatives to Moment.js
While Moment.js has been a popular choice for many years, it’s considered a legacy project now. The development team recommends using alternatives like date-fns or Luxon for new projects, as these libraries are more modular and tree-shakeable, resulting in smaller bundle sizes.