Migrating from Moment.js to JavaScript's New Temporal API

Migrating from Moment.js to JavaScript's New Temporal API

By Sylvester Das

March 31, 2026

4 min read

Struggling with JavaScript's native Date object or maintaining an aging Moment.js codebase? The landscape of JavaScript date and time handling has seen significant evolution. While Moment.js was a popular solution for years, addressing many shortcomings of the built-in Date API, it has since entered maintenance mode with its creators recommending new projects avoid it due to its mutable nature and large bundle size.

Enter the Temporal API, a modern, robust, and much-anticipated addition to the JavaScript standard library. Temporal aims to solve the complex challenges of date and time manipulation with an immutable, explicit, and intuitive API. It offers distinct types for dates, times, date-times, and time zones, providing clarity and preventing common bugs.

Moving From Moment.js To The JS Temporal API

Why Temporal?

Temporal introduces several key improvements:

  • Immutability: All Temporal objects are immutable. Operations like adding or subtracting time return new objects, preventing unexpected side effects.
  • Explicit Time Zones: It handles time zones explicitly, making it easier to work with global applications without ambiguity.
  • Comprehensive Types: Separate types for `Temporal.

PlainDate, Temporal.

PlainTime, Temporal.

PlainDateTime, Temporal.

ZonedDateTime, Temporal.

Duration, and Temporal.

Instant` simplify complex scenarios.

  • Easy Arithmetic: Performing calculations like adding days, months, or years is straightforward and reliable.

Practical Migration Recipes

Let's look at common Moment.js operations and how to achieve them with the Temporal API.

1. Getting the Current Date and Time

Moment.js:

moment().format();
// "2023-10-27T10:30:00-04:00"

Temporal:

For the current date and time in the system's time zone:


javascript
Temporal.

Now.zonedDateTimeISO().toString();
// "2023-10-27T10:30:00-04:00[America/New_York]"

For a specific date without time zone:


javascript
Temporal.

Now.plainDateISO().toString();
// "2023-10-27"

2. Creating a Specific Date or DateTime

Moment.js:


javascript
moment("2023-01-15");
moment("2023-01-15T14:30:00");

Temporal:


javascript
Temporal.

PlainDate.from("2023-01-15");
// Temporal.

PlainDate <2023-01-15>

Temporal.

PlainDateTime.from("2023-01-15T14:30:00");
// Temporal.

PlainDateTime <2023-01-15T14:30:00>

// With a specific time zone
Temporal.

ZonedDateTime.from({
  year: 2023, month: 1, day: 15,
  hour: 14, minute: 30,
  timeZone: "America/New_York"
});
// Temporal.

ZonedDateTime <2023-01-15T14:30:00-05:00[America/New_York]>

3. Adding and Subtracting Time

Moment.js:


javascript
moment().add(1, 'day');
moment().subtract(2, 'hours');

Temporal:


javascript
const today = Temporal.

Now.plainDateISO();
today.add({ days: 1 }).toString();
// "2023-10-28"

const now = Temporal.

Now.zonedDateTimeISO();
now.subtract({ hours: 2 }).toString();
// "2023-10-27T08:30:00-04:00[America/New_York]"

4. Formatting Dates

Temporal leverages the `Intl.

DateTimeFormat` API for robust localization.

Moment.js:


javascript
moment().format('YYYY-MM-DD HH:mm');
// "2023-10-27 10:30"

Temporal:


javascript
const dateTime = Temporal.

Now.zonedDateTimeISO();
dateTime.toLocaleString('en-US', {
  year: 'numeric', month: '2-digit', day: '2-digit',
  hour: '2-digit', minute: '2-digit',
  hourCycle: 'h23'
});
// "10/27/2023, 10:30"

// For ISO format (similar to Moment's default)
dateTime.toString({ fractionalSecondDigits: 0 });
// "2023-10-27T10:30:00-04:00[America/New_York]"

Tradeoffs and Considerations

While Temporal brings significant improvements, it's essential to consider its current status:

  • Browser Support: As of late 2023, Temporal is still a Stage 3 proposal and not yet natively supported in all major browsers. You'll likely need a polyfill (e.g., core-js or @js-temporal/polyfill) for production use.
  • Learning Curve: The explicit nature of Temporal's types means a new mental model compared to Date or Moment.js. Understanding PlainDate, PlainDateTime, ZonedDateTime, and Instant is crucial.
  • Bundle Size: While Moment.js is heavy, the Temporal polyfill also adds to your bundle size. However, the long-term benefit of a native, standard API often outweighs this.

Conclusion

Migrating from Moment.js to the Temporal API is a forward-looking step that will lead to more robust, maintainable, and less error-prone date and time handling in your JavaScript applications. While it requires an initial investment in learning and potentially polyfills, the benefits of immutability, explicit time zones, and a well-designed API make it a worthwhile transition for any modern JavaScript project. Start experimenting with Temporal today to prepare your codebase for the future of JavaScript time management.


Share this article

Advertisement

Shorten Your Links, Amplify Your Reach

Tired of long, clunky URLs? Create short, powerful, and trackable links with MiniFyn. It's fast, free, and easy to use.


Follow Us for Updates