Moment JS - Documentation

What is Moment.js?

Moment.js is a popular JavaScript library that provides a simple way to parse, manipulate, validate, and format dates and times. It’s designed to be easy to use and understand, while offering a comprehensive range of features for handling various date and time-related tasks. While newer libraries like Luxon and date-fns offer similar functionality, Moment.js remains widely used due to its extensive ecosystem and familiarity within the developer community. However, it’s important to note that Moment.js is not a module and relies on global variables. This can introduce potential conflicts with other libraries or module bundlers, and it has a larger bundle size compared to some modern alternatives.

Why use Moment.js?

Moment.js simplifies many common date and time operations that would otherwise require complex and error-prone manual coding. Specifically, it excels in:

Installation and Setup

Moment.js can be included in your project in several ways:

1. Using a CDN: This is the quickest method for simple projects. Include the following <script> tag in your HTML file:

<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.4/moment.min.js"></script>

Replace 2.29.4 with the desired version number if needed. Check the official Moment.js website for the latest version.

2. Using npm (Node Package Manager): If you’re using npm (common in Node.js and many front-end build systems like Webpack or Parcel), install it via the command line:

npm install moment

Then, import it into your JavaScript file:

const moment = require('moment');

3. Using yarn (Yarn Package Manager): Similar to npm, use yarn:

yarn add moment

And then import it:

import moment from 'moment';

Remember to adjust the import based on your module system (e.g., ES modules, CommonJS).

Basic Usage Examples

After installation, you can start using Moment.js:

1. Creating a Moment object:

// Create a moment object from the current date and time
const now = moment();
console.log(now); // Output: current date and time

// Create a moment object from a specific date
const birthday = moment('1985-10-26');
console.log(birthday); // Output: 1985-10-26

// Create a moment object from a date string with a specified format
const dateString = "October 26, 1985";
const parsedDate = moment(dateString, "MMMM DD, YYYY");
console.log(parsedDate); // Output: 1985-10-26

2. Formatting a date:

const formattedDate = birthday.format('MMMM Do YYYY, h:mm:ss a'); // October 26th 1985, 12:00:00 am
console.log(formattedDate);

const anotherFormattedDate = birthday.format('YYYY-MM-DD'); // 1985-10-26
console.log(anotherFormattedDate);

3. Manipulating dates:

const futureDate = birthday.add(10, 'years'); // Add 10 years
console.log(futureDate.format('YYYY-MM-DD')); // Output: 1995-10-26

const pastDate = now.subtract(5, 'days'); // Subtract 5 days
console.log(pastDate.format('YYYY-MM-DD')); // Output: (5 days before current date)

These examples demonstrate the basic functionality of Moment.js. The library offers many more advanced features detailed in subsequent sections of this manual. Refer to the official Moment.js documentation for a complete list of methods and options.

Creating Moment Objects

Moment.js provides several ways to create Moment objects, representing specific points in time. Understanding these methods is crucial for effectively using the library.

Creating Moment Objects from Dates

You can create a Moment object directly from a JavaScript Date object. This is useful when you already have a date object available in your application.

const now = new Date(); // Get the current date and time
const momentFromJsDate = moment(now);
console.log(momentFromJsDate.format()); // Output: current date and time in default format

const specificDate = new Date(1985, 9, 26); // Month is 0-indexed (October is 9)
const momentFromSpecificDate = moment(specificDate);
console.log(momentFromSpecificDate.format('YYYY-MM-DD')); // Output: 1985-10-26

Creating Moment Objects from Strings

Moment.js excels at parsing date strings. It intelligently attempts to understand various formats, but specifying the format explicitly is recommended for robustness.

Automatic Parsing (Inferring Format):

const dateString1 = "2024-03-15";
const momentFromString1 = moment(dateString1);
console.log(momentFromString1.format()); //Output: 2024-03-15 (Uses default format)

const dateString2 = "March 15th, 2024";
const momentFromString2 = moment(dateString2);
console.log(momentFromString2.format()); // Output: 2024-03-15 (Moment attempts to parse, but might be unreliable)

Explicit Parsing (Specifying Format):

Explicitly defining the format ensures accurate parsing, especially with less common date string formats. Refer to the Moment.js documentation for format codes (e.g., YYYY, MM, DD, MMMM, etc.).

const dateString3 = "10/26/1985";
const momentFromString3 = moment(dateString3, "MM/DD/YYYY"); // Specify the format
console.log(momentFromString3.format('YYYY-MM-DD')); // Output: 1985-10-26

const dateString4 = "Oct 26, 1985";
const momentFromString4 = moment(dateString4, "MMM DD, YYYY"); // Specifying "MMM" for abbreviated month name
console.log(momentFromString4.format('YYYY-MM-DD')); // Output: 1985-10-26

Incorrect format specification will lead to unexpected results. Always double-check your format string against the actual date string.

Creating Moment Objects from Unix Timestamps

A Unix timestamp represents the number of seconds that have elapsed since the Unix epoch (January 1, 1970, 00:00:00 UTC). Moment.js can create Moment objects from these timestamps.

const unixTimestamp = 1678886400; // Example timestamp (March 15, 2023, 00:00:00 UTC)
const momentFromTimestamp = moment.unix(unixTimestamp);
console.log(momentFromTimestamp.format()); // Output: March 15th 2023, 00:00:00 (Default format, may vary based on timezone)

// Using milliseconds (more common in JavaScript):
const unixTimestampMillis = 1678886400000;
const momentFromMillis = moment(unixTimestampMillis);
console.log(momentFromMillis.format()); // Output: Same as above

Remember that Unix timestamps are typically in seconds since the epoch, while JavaScript’s Date object uses milliseconds.

Creating Moment Objects with Specific Formats

Moment.js allows you to create Moment objects while simultaneously specifying the desired format. This approach combines creation and formatting in a single step.

While not directly creating a Moment object with a format, you can immediately format the date after creation. This is generally preferred:

const specificDate2 = moment([2024, 2, 15]); // Year, Month (0-indexed), Day. Creates moment object.
const formattedDate = specificDate2.format("MMMM Do YYYY");  // Formats to "March 15th 2024"
console.log(formattedDate);


const myDate = moment("15/03/2024", "DD/MM/YYYY"); // Parse from string with specified format.
console.log(myDate.format("DD/MM/YYYY")); // Outputs: 15/03/2024

There’s no dedicated constructor that simultaneously creates and formats. Formatting is a separate operation performed after creating the Moment object using one of the previously described methods.

Manipulating Dates and Times

Moment.js provides a rich set of methods for manipulating dates and times. This section covers key operations for adding/subtracting time units, accessing/modifying individual components, handling time zones, formatting output, and displaying relative times.

Adding and Subtracting Time

Moment.js makes it easy to add or subtract various time units to a Moment object. The primary methods are add() and subtract().

const now = moment();

// Adding time units
const future = now.add(7, 'days').add(2, 'hours'); // Add 7 days and 2 hours
console.log(future.format());

const future2 = now.add({days: 7, hours: 2}); //Add using object for multiple units at once
console.log(future2.format());

// Subtracting time units
const past = now.subtract(1, 'months').subtract(10, 'days'); // Subtract 1 month and 10 days
console.log(past.format());

const past2 = now.subtract({months: 1, days: 10}); //Subtract using object for multiple units at once
console.log(past2.format());

You can add or subtract years, months, days, hours, minutes, seconds, and milliseconds. These are case-insensitive.

Getting and Setting Date and Time Components

Individual components of a date and time (year, month, day, hour, etc.) can be accessed and modified using getter and setter methods. Months are 0-indexed (January is 0, February is 1, etc.).

const myDate = moment('2024-03-15 10:30:00');

// Getters
console.log(myDate.year());     // Output: 2024
console.log(myDate.month());    // Output: 2 (March)
console.log(myDate.date());     // Output: 15
console.log(myDate.day());      // Output: 4 (Thursday)
console.log(myDate.hours());    // Output: 10
console.log(myDate.minutes());   // Output: 30
console.log(myDate.seconds());   // Output: 0
console.log(myDate.milliseconds()); // Output: 0

// Setters
myDate.year(2025);
myDate.month(11); // December
myDate.date(25);
console.log(myDate.format('YYYY-MM-DD')); // Output: 2025-12-25

myDate.set({ hour: 14, minute: 45 }); //Setting multiple at once
console.log(myDate.format('YYYY-MM-DD HH:mm')); //Output: 2025-12-25 14:45

Working with Time Zones

Moment.js itself doesn’t directly handle time zones. You’ll need the moment-timezone add-on library. After installing it (npm install moment-timezone), you can use it as follows:

const momentTz = require('moment-timezone'); //Requires moment-timezone

const nowInNYC = momentTz().tz("America/New_York");
console.log(nowInNYC.format());

const londonTime = momentTz('2024-03-15 10:00', 'YYYY-MM-DD HH:mm').tz("Europe/London");
console.log(londonTime.format());

const converted = londonTime.clone().tz("America/Los_Angeles"); //Convert timezone
console.log(converted.format());

Remember to replace "America/New_York" and "Europe/London" with appropriate IANA time zone names. Consult the moment-timezone documentation for a complete list.

Date and Time Formatting

Moment.js offers extensive formatting capabilities using custom format strings.

const myMoment = moment();

console.log(myMoment.format());          // Default format (e.g., 2024-03-16T10:37:43-08:00)
console.log(myMoment.format('YYYY-MM-DD')); // YYYY-MM-DD format (e.g., 2024-03-16)
console.log(myMoment.format('MMMM Do YYYY, h:mm:ss a')); // Long format (e.g., March 16th 2024, 10:37:43 am)
console.log(myMoment.format('dddd'));      // Day of the week (e.g., Saturday)
console.log(myMoment.format('MMM'));       // Abbreviated month name (e.g., Mar)
console.log(myMoment.format('HH:mm:ss'));   // 24-hour time (e.g., 10:37:43)

Refer to the Moment.js documentation for a full list of format tokens.

Relative Time

Moment.js allows you to display dates and times relative to the current time.

const now = moment();
const past = moment().subtract(2, 'days');
const future = moment().add(5, 'hours');

console.log(past.fromNow());      // e.g., "2 days ago"
console.log(future.fromNow());    // e.g., "in 5 hours"
console.log(now.from(past));    // e.g., "2 days after"
console.log(past.from(future));  // e.g., "in 2 days and 5 hours"

fromNow() provides relative time from the current moment. from() shows relative time between two Moment objects. The output will naturally adjust as time progresses.

Date and Time Formatting

Moment.js provides powerful and flexible tools for formatting dates and times. This section details how to use its formatting capabilities, including understanding tokens, creating custom format strings, parsing dates, and handling locale-specific formatting.

Understanding Moment.js Formatting Tokens

Moment.js uses tokens to represent different parts of a date and time. These tokens are single characters or short strings that are inserted into a format string to specify the desired output. Here are some key tokens:

Token Description Example Output (for March 15, 2024)
YYYY Year with century 2024
YY Year without century 24
MMMM Full month name March
MMM Abbreviated month name Mar
MM Month (01-12) 03
M Month (1-12) 3
DD Day of the month (01-31) 15
D Day of the month (1-31) 15
dddd Full day name Friday
ddd Abbreviated day name Fri
HH Hour (00-23) 14
H Hour (0-23) 14
hh Hour (01-12) 02
h Hour (1-12) 2
mm Minute (00-59) 30
ss Second (00-59) 45
SSS Millisecond (000-999) 123
A AM/PM PM
a am/pm pm
Z Timezone offset -08:00
ZZ Timezone offset (short) -0800
X Unix timestamp (seconds) 1678970000
x Unix timestamp (milliseconds) 1678970000000
Qo Quarter of the year (1-4) 1
Do Day of month with ordinal suffix (1st, 2nd) 15th

A comprehensive list of tokens and their functionality can be found in the official Moment.js documentation.

Customizing Format Strings

By combining these tokens, you can create custom format strings to display dates and times in any desired way.

const moment = require('moment');
const myDate = moment('2024-03-15 14:30:45');

console.log(myDate.format('YYYY-MM-DD HH:mm:ss')); // 2024-03-15 14:30:45
console.log(myDate.format('MMM Do YY, h:mm A'));   // Mar 15th 24, 2:30 PM
console.log(myDate.format('dddd, MMMM Do YYYY'));   // Friday, March 15th 2024

Parsing Dates from Strings

Moment.js can parse dates from strings using a format string that matches the structure of the input string. This is crucial for converting user input or data from external sources into Moment objects.

const dateString1 = '2024-03-15';
const parsedDate1 = moment(dateString1, 'YYYY-MM-DD'); // Explicit format specified

const dateString2 = 'March 15, 2024';
const parsedDate2 = moment(dateString2, 'MMMM D, YYYY');

console.log(parsedDate1.format());  // Output: 2024-03-15
console.log(parsedDate2.format());  // Output: 2024-03-15

// Without explicitly specifying the format, Moment.js will attempt to guess but this is less reliable:
const parsedDate3 = moment(dateString2); //Moment attempts to guess the format, avoid if possible
console.log(parsedDate3.format());      // Output: might be correct, might be incorrect.

Always specify the format string when parsing, unless you’re absolutely certain Moment.js will correctly infer the input date string’s format.

Locale-Specific Formatting

Moment.js supports localization, allowing you to format dates and times according to different locales. You can change the locale using moment.locale(). This will affect both formatting and parsing.

moment.locale('es'); // Set locale to Spanish

const myDateEs = moment();
console.log(myDateEs.format('LLLL')); // Output: Date formatted according to Spanish locale


moment.locale('fr'); //Change to French
const myDateFr = moment();
console.log(myDateFr.format('LLLL')); // Output: Date formatted according to French locale

moment.locale('en'); // Reset to English

Numerous locale files are available; check the Moment.js documentation or use moment.locales() to see which locales are included in your version. You may need to install additional locale files separately if you require support for languages not included by default.

Working with Durations

Moment.js allows you to work with durations—the difference between two points in time—using moment.duration(). This provides a way to represent time spans and perform calculations on them.

Creating Duration Objects

Duration objects are created using the moment.duration() function. You can create them in several ways:

const duration1 = moment.duration(15000); // 15 seconds
console.log(duration1.asSeconds()); // Output: 15
console.log(duration1.asMinutes()); // Output: 0.25
const duration2 = moment.duration({
  years: 2,
  months: 3,
  days: 10,
  hours: 5,
  minutes: 30,
  seconds: 15,
});

console.log(duration2.years());    // Output: 2
console.log(duration2.months());   // Output: 3
console.log(duration2.days());     // Output: 10
// and so on...
const duration3 = moment.duration("2 years 3 months"); //Might be able to parse this, but its not generally recommended
console.log(duration3.asMonths()); // Output: 27 (approx.)
const start = moment('2024-01-01');
const end = moment('2024-03-15');
const duration4 = moment.duration(end.diff(start)); //Important: diff returns milliseconds

console.log(duration4.asDays()); // Output: approximately 75
console.log(duration4.humanize()); // Output: about 2 months (see Human-Readable Duration Output)

Remember that end.diff(start) returns the difference in milliseconds.

Manipulating Durations

Durations can be manipulated using methods like add() and subtract().

const duration = moment.duration({ days: 5, hours: 3 });

duration.add(2, 'days');          // Add 2 days
duration.add({ hours: 1, minutes: 30 }); // Add 1 hour and 30 minutes
duration.subtract(1, 'hour');    // Subtract 1 hour

console.log(duration.days());     // Output: 7
console.log(duration.hours());    // Output: 2.5 (2 hours and 30 minutes)

You can add or subtract any of the supported time units.

Formatting Durations

Durations can be formatted using the humanize() method, which provides a human-readable representation.

Human-Readable Duration Output

The humanize() method is the most straightforward way to display durations in a user-friendly format.

const duration = moment.duration(123456789);

console.log(duration.humanize());  // Output: about 1 day (or similar, depending on duration)
console.log(duration.humanize(true)); //Output: in about 1 day.  Adds "in" before the duration


const durationDays = moment.duration({ days: 7 });
console.log(durationDays.humanize()); // Output: a week

const durationLong = moment.duration({ years: 2, days: 100});
console.log(durationLong.humanize()); // Output: about 2 years

The output is automatically adjusted to use appropriate units and phrasing (e.g., “a few seconds,” “a day,” “a few weeks”). Note that the humanize output might change slightly based on language setting of Moment.js.

By combining these features, you can effectively work with durations in your Moment.js applications, providing human-readable and easily manipulated time spans. Remember to always handle the potential inaccuracies inherent in duration calculations, especially when dealing with months or years due to varying day counts.

Calendars and Time Zones

Moment.js’s core functionality focuses on the Gregorian calendar, but extensions allow for handling other calendars and time zones effectively. This section covers those advanced features. Note that robust time zone handling requires the moment-timezone add-on library; make sure it’s installed (npm install moment-timezone).

Working with Different Calendars

Moment.js primarily uses the Gregorian calendar. While it doesn’t directly support other calendar systems natively, you can find community-maintained plugins and extensions providing this functionality. These plugins typically add methods to create and manipulate dates according to the rules of alternative calendars (e.g., Islamic, Persian, Hebrew). Refer to the Moment.js website or community resources to find relevant plugins for your needs. Support and maintenance vary for these third-party additions.

Handling Time Zones

Moment.js alone doesn’t handle time zones inherently. The moment-timezone library is required for working with time zones effectively. After installing it, import it into your project and use the tz() method to specify a time zone.

const momentTz = require('moment-timezone');

const now = momentTz(); //Gets current time in system's default timezone
console.log(now.format());

const nowInLondon = momentTz().tz("Europe/London");
console.log(nowInLondon.format());

const specificTimeInTokyo = momentTz("2024-04-20 10:00", "YYYY-MM-DD HH:mm").tz("Asia/Tokyo");
console.log(specificTimeInTokyo.format());

Replace "Europe/London" and "Asia/Tokyo" with the appropriate IANA time zone identifiers. Consult the moment-timezone documentation for a comprehensive list of supported time zones.

Converting Between Time Zones

With moment-timezone, you can easily convert a Moment object from one time zone to another using the tz() method:

const newYorkTime = momentTz().tz("America/New_York");
const londonTime = newYorkTime.clone().tz("Europe/London"); //Clone to avoid modifying original object

console.log("New York:", newYorkTime.format());
console.log("London:", londonTime.format());

The clone() method ensures that the original Moment object remains unchanged.

Parsing and Displaying Dates in Various Time Zones

You can parse dates from strings that include time zone information and display dates in different time zones.

const dateString = "2024-03-15 10:00 -05:00"; //Date string includes timezone offset
const parsedDate = momentTz(dateString, "YYYY-MM-DD HH:mm Z"); //Parse with timezone info

console.log("Original:", parsedDate.format());

console.log("In Pacific Time:", parsedDate.tz("America/Los_Angeles").format());
console.log("In Tokyo:", parsedDate.tz("Asia/Tokyo").format());

This demonstrates how to parse a date string containing a timezone offset and then display it in different zones. It’s essential to provide the correct format string to the momentTz() parser to accurately handle the time zone information in the input string.

Remember that working with time zones introduces complexities. Ensure you understand daylight saving time (DST) and other potential time zone transitions for accurate calculations and conversions. The moment-timezone library handles many of these details, but understanding the underlying concepts is still crucial. Always check the official documentation for the most up-to-date information and best practices.

Advanced Usage and Customization

This section delves into more advanced techniques for customizing and extending Moment.js to fit specific project needs.

Locale Customization

Beyond simply switching locales using moment.locale(), you can create and register entirely new locales or modify existing ones. This allows for highly customized date and time formatting and parsing tailored to specific languages or regional conventions.

To create a new locale, you’ll define a locale object and register it with Moment.js. The locale object must include at least the longDateFormat property, specifying the format for different date/time representations.

moment.locale('myCustomLocale', {
  longDateFormat: {
    LTS: 'h:mm:ss A',
    LT: 'h:mm A',
    L: 'MM/DD/YYYY',
    LL: 'MMMM D YYYY',
    LLL: 'MMMM D YYYY h:mm A',
    LLLL: 'dddd, MMMM D YYYY h:mm A'
  },
  calendar: {
    sameDay: '[Today at] LT',
    nextDay: '[Tomorrow at] LT',
    nextWeek: 'dddd [at] LT',
    lastDay: '[Yesterday at] LT',
    lastWeek: '[Last] dddd [at] LT',
    sameElse: 'L'
  },
  relativeTime : {
    future: "in %s",
    past: "%s ago",
    s  : 'a few seconds',
    ss : '%d seconds',
    m  : 'a minute',
    mm : '%d minutes',
    h  : 'an hour',
    hh : '%d hours',
    d  : 'a day',
    dd : '%d days',
    M  : 'a month',
    MM : '%d months',
    y  : 'a year',
    yy : '%d years'
  },
  week : {
    dow : 1, // Monday is the first day of the week.
    doy : 4  // The week that contains Jan 4th is the first week of the year.
  }
});

const customDate = moment();
console.log(customDate.locale('myCustomLocale').format('LLLL'));

This example creates a locale named myCustomLocale with customized format strings and relative time expressions. Remember to include all necessary properties; refer to the Moment.js documentation for a complete list. Modifying existing locales involves creating a new object that extends the existing one.

Extending Moment.js

Moment.js allows for extending its functionality by adding custom methods or properties. This can be done by directly adding methods to the moment object’s prototype.

moment.fn.isLeapYear = function () {
  return this.year() % 4 === 0 && (this.year() % 100 !== 0 || this.year() % 400 === 0);
};

const myDate = moment('2024-01-01');
console.log(myDate.isLeapYear()); // Output: true

This example adds a new method isLeapYear to check if a moment object represents a leap year. Use this pattern for adding custom functionality.

Creating Custom Format Tokens

While Moment.js provides many pre-defined format tokens, you can extend this by defining custom tokens. These tokens are processed using the parseFormat and format functions within a locale definition. This is more involved than simply adding methods to the moment prototype, and should only be done for very specific formatting needs not otherwise achievable.

The details of custom token creation are quite complex and depend heavily on how you are constructing and modifying your locale. Consult the advanced documentation of Moment.js for detailed instructions on this process. Unless you have a specific and compelling reason to define custom tokens, it’s generally recommended to utilize existing formatting options and extensions first.

Integrating with Other Libraries

Moment.js can be integrated with other JavaScript libraries. It often works well with front-end frameworks like React, Angular, or Vue.js. The integration typically involves including Moment.js in your project and using it within your component logic to format and manipulate dates and times. There are no special mechanisms for integration; you simply use Moment.js as part of your application’s code.

For example, in a React component:

import React from 'react';
import moment from 'moment';

const MyComponent = () => {
  const currentDate = moment();
  return <div>The current date is: {currentDate.format('MMMM Do YYYY')}</div>;
};

There might be community-maintained add-ons or helpers simplifying integration with particular frameworks, but often direct use of Moment.js within your framework’s component structure is sufficient. Be aware of potential bundle size increases when including Moment.js, particularly in large applications. Consider more lightweight alternatives like Luxon or date-fns if size is a critical constraint.

Remember to always consult the relevant documentation for Moment.js and any other libraries you are using to ensure compatibility and proper integration.

Common Use Cases and Examples

This section showcases common use cases for Moment.js, providing practical examples to illustrate its capabilities.

Calculating Time Differences

Calculating the difference between two dates or times is a frequent task. Moment.js simplifies this using the diff() method.

const startDate = moment('2023-10-26');
const endDate = moment(); // Current date and time

// Difference in days
const diffDays = endDate.diff(startDate, 'days');
console.log(`Difference in days: ${diffDays}`);

// Difference in months
const diffMonths = endDate.diff(startDate, 'months');
console.log(`Difference in months: ${diffMonths}`);

// Difference in years
const diffYears = endDate.diff(startDate, 'years');
console.log(`Difference in years: ${diffYears}`);

// Difference in milliseconds (raw difference)
const diffMillis = endDate.diff(startDate); // Default is milliseconds
console.log(`Difference in milliseconds: ${diffMillis}`);

//More precise date difference (using moment-precise-range):
// Requires the installation of the plugin: npm install moment-precise-range

// Import the plugin if it isn't automatically included
const momentPreciseRange = require('moment-precise-range');
const preciseDifference = moment.preciseDiff(startDate, endDate);
console.log(preciseDifference);

The diff() method takes the other date as the first argument and the unit (‘days’, ‘months’, ‘years’, etc.) as the second. The raw millisecond difference can also be used for further calculations. Note that the calculation of months and years can be imprecise due to the varying lengths of those units. Consider using a dedicated plugin like moment-precise-range for more detailed differences.

Formatting Dates for Display

Formatting dates appropriately for display is essential for user experience. Moment.js offers flexible formatting options.

const myDate = moment(); //Current Date

// Different formatting options:
console.log(myDate.format('YYYY-MM-DD'));    // ISO 8601 format
console.log(myDate.format('MMMM Do YYYY'));  // March 16th 2024
console.log(myDate.format('dddd, MMMM Do')); // Friday, March 16th
console.log(myDate.format('h:mm A'));        // 10:30 AM (12-hour format)
console.log(myDate.format('HH:mm'));         // 10:30 (24-hour format)

// Custom format with locale:
moment.locale('es'); //Set locale to Spanish
console.log(myDate.format('LLLL'));  // Date fully formatted in Spanish
moment.locale('en'); //Reset locale to English

Remember to consult the Moment.js documentation for a complete list of formatting tokens.

Working with Relative Time

Displaying dates relative to the current time (“2 days ago,” “in 5 hours”) enhances readability.

const pastDate = moment().subtract(2, 'days');
const futureDate = moment().add(5, 'hours');

console.log(pastDate.fromNow());    // Output: 2 days ago
console.log(futureDate.fromNow());  // Output: in 5 hours

The fromNow() method provides a user-friendly relative time representation.

Generating Date Ranges

Generating a sequence of dates within a given range is helpful for calendars or scheduling applications.

const startDate = moment('2024-03-01');
const endDate = moment('2024-03-10');
const dates = [];

let currentDate = startDate.clone();
while (currentDate.isSameOrBefore(endDate)) {
  dates.push(currentDate.format('YYYY-MM-DD'));
  currentDate.add(1, 'days');
}

console.log(dates); // Output: Array of dates from March 1st to March 10th

This example iterates through the dates, adding each formatted date to an array. The isSameOrBefore check ensures that the loop correctly ends at the endDate. This technique can be adapted for different time units. For more advanced range generation scenarios, consider using a dedicated date range library in conjunction with Moment.js.

These examples demonstrate common use cases. Remember to always consult the Moment.js documentation for more detailed information and advanced techniques.

Troubleshooting and FAQs

This section addresses common issues, frequently asked questions, debugging strategies, and resources for further assistance.

Common Errors and Solutions

Several common errors arise when using Moment.js. Here are a few with solutions:

Frequently Asked Questions

Debugging Tips

Community Resources

By using these resources and following the debugging tips, you will be better equipped to solve problems and effectively utilize Moment.js in your projects. However, be mindful of the considerations around library size and maintenance for new projects.

Appendix: API Reference

This appendix provides a concise reference to the key methods and properties of Moment.js. Due to the extensive nature of the API, this is a summary. Consult the official Moment.js documentation for the most comprehensive and up-to-date information. Note that the moment-timezone addon adds further methods if it is included.

Moment Object Methods

Moment objects are the core of Moment.js. They represent specific points in time. Key methods include:

Duration Object Methods

Duration objects represent a time span. Key methods include:

Global Methods

Moment.js also provides several global methods:

Locale Data

Locale data defines how dates and times are formatted and parsed for different languages and regions. It’s a complex object with properties for long date formats, relative time expressions, calendar-specific information, etc. Consult the official documentation for the exact structure and properties.

Constants

Moment.js defines several constants for internal use. These are generally not directly accessed by developers but are relevant for understanding the underlying implementation. These are not usually exposed to the public API and will likely vary based on the version of Moment.js.

Important Note: This is a simplified summary. The complete API is significantly more extensive. Always refer to the official Moment.js documentation for the most accurate and detailed API reference. The API may change between versions.