Moment.js

Parse, validate, manipulate, and display dates in JavaScript with a chainable API.

Library
npm
v2.31.0
47,885 stars
MIT License

Repository Health

Pre-computed score based on development activity, maintenance, community, maturity, and trend momentum. How we score it →
87 /100 Excellent
Development Activity 92
Maintenance 72
Community 84
Maturity 60
Momentum 40

Technical Analysis

AI-assessed by reading the actual repository — architecture, code quality, innovation, and documentation. How we score it →
69 /100 Good
Architecture 68
Code Quality 72
Innovation 55
Learning Curve 80

Moment.js is a battle-tested JavaScript library for parsing, validating, manipulating, and formatting dates and times. It normalizes ISO 8601 strings, RFC 2822 strings, arrays, plain objects, and native Date instances into a single chainable Moment object, then exposes getters, setters, arithmetic (add/subtract/diff), and locale-aware formatting through one consistent API.

Originally released in 2011, Moment became the de facto standard for date handling in the JavaScript ecosystem for nearly a decade, and ships with 137 bundled locale files for out-of-the-box internationalized output. The project is now in maintenance mode — the maintainers explicitly recommend newer, immutable, tree-shakeable alternatives for new projects — but Moment remains widely deployed in legacy codebases and is still the most immediately recognizable name in JS date handling.

What You Get

  • A single moment() factory that parses ISO 8601, RFC 2822, arrays, plain objects, or custom format strings into one consistent Moment instance
  • A chainable API for arithmetic and queries — .add(), .subtract(), .diff(), .startOf(), .isBefore(), .isSame() — that all compose on the same object
  • 137 bundled locale files for out-of-the-box internationalized month names, weekday names, and relative-time phrasing
  • Flexible, token-based formatting and parsing (.format(‘YYYY-MM-DD’), custom token strings) with strict-mode parsing for validation
  • Duration support (moment.duration()) for representing and formatting spans of time independent of a fixed calendar date
  • UMD packaging that works via CommonJS require, AMD, or a plain <script> global, plus hand-maintained TypeScript typings

Common Use Cases

  • Formatting and displaying dates in a user’s locale in legacy server-rendered or jQuery-era frontends
  • Parsing loosely-formatted date strings from forms, CSV imports, or third-party APIs into a validated Date
  • Computing relative time (‘3 hours ago’) and human-readable durations for activity feeds and timestamps
  • Date arithmetic in Node.js backends — adding business days, computing age, or generating date ranges for reports
  • Maintaining and extending older codebases that already depend on Moment where a migration to a newer library isn’t yet planned

Under The Hood

Architecture

Moment wraps the native JavaScript Date object behind a single moment() factory function exported from src/lib/moment/moment.js, with construction logic split across src/lib/create/ (from-string.js, from-array.js, from-string-and-format.js, from-object.js) that normalizes any input — ISO strings, RFC 2822 strings, arrays, plain objects, other Moment instances, or a format string — into an internal _d Date plus a set of parsing-flag diagnostics from parsing-flags.js. Once constructed, a Moment instance exposes a large chainable prototype (src/lib/moment/prototype.js) whose getters/setters (src/lib/units/*.js, one file per unit: year.js, month.js, day-of-month.js, etc.) read and write through a shared set-tokens helper so operations like .add(), .subtract(), .startOf(), and .diff() all funnel through the same duration and unit-offset primitives in src/lib/duration/. Formatting output runs the inverse of parsing: src/lib/format/format.js tokenizes a format string once and caches the token array, then src/lib/locale/ (137 locale files) supplies the token-to-string tables consumed at format time, giving locale-aware output without touching Intl.

Tech Stack

The library ships as hand-written, dependency-free ES5-compatible JavaScript (package.json has zero runtime dependencies) authored in an ES module style under src/ and built to a single UMD bundle (moment.js at the repo root, dist/moment.js) via a Grunt + Rollup pipeline (Gruntfile.js, grunt-contrib-concat/uglify tasks) so it can be required from CommonJS, loaded via AMD, or dropped in as a global <script> tag. TypeScript typings are maintained by hand in moment.d.ts and mirrored for older TypeScript versions under ts3.1-typings/, rather than generated from source. Dev tooling is ESLint (eslint:recommended, ES6 module parsing) plus Prettier for formatting, and the test/build scripts are orchestrated entirely through Grunt rather than a modern bundler like Vite or esbuild — a reflection of the project’s age (created 2011).

Code Quality

Test coverage is substantial: 193 files under src/test/ (split into src/test/moment/, src/test/locale/, and src/test/helpers/) run on QUnit via Karma across multiple browser launchers (Chrome, Firefox, Sauce Labs), covering both core API behavior and per-locale formatting edge cases. Source files are small and single-purpose (e.g. src/lib/create/from-string-and-format.js at ~140 lines handles only ISO/RFC2822/custom-format parsing dispatch), which keeps individual units easy to reason about even though the overall API surface is large. Naming is consistent and low-abstraction (plain function exports, no classes), matching the codebase’s 2011-era JavaScript style, and ESLint’s eslint:recommended ruleset is enforced in CI. The main caveat found in the README itself: the project is explicitly in maintenance mode (‘Moment.js is a legacy project… In most cases, you should choose a different library’), so code quality is stable but not actively hardened against new edge cases.

API Design

Moment’s signature strength is a fluent, chainable API — moment().add(1, ‘day’).format(‘YYYY-MM-DD’) — that made it the default JS date library for a decade, and that ergonomic pattern is still widely imitated by successor libraries. Getting started requires no configuration: import moment, call moment() or moment(‘2024-01-01’), and every mutation/query method returns a Moment or primitive without extra boilerplate. The cost is a large, sometimes overlapping method surface (multiple ways to parse the same input, mutable-by-default instances that trip up developers expecting immutability) and a mutable object model that the library’s own docs now steer newcomers away from in favor of immutable alternatives. Documentation at momentjs.com/docs is thorough and example-driven, and the maintainers’ ‘Project Status’ page is unusually candid about the library’s limitations and recommended alternatives.

Used by 63 apps in this directory

TypeScript
96%
Other

CapRover

Developer Tools · Devops · Hosting Control Panel

15,188

Deploy any app, database, or website to your own server in minutes—no Docker or Linux expertise required.

View details
88
Repo Health
82
Technical
67
Dependency
Built with
TypeScript 96%
Updated 6 days ago
JavaScript
99%
Other

ChartBrew

Analytics · Databases

4,062

Open-source reporting platform to build live dashboards from SQL, NoSQL, APIs, and SaaS tools with an AI assistant that creates charts from natural language.

View details
85
Repo Health
83
Technical
64
Dependency
Built with
JavaScript 99%
Updated 1 weeks ago
TypeScript
53%
Other

Chaskiq

CRM · Customer Support

3,577

Self-hosted live chat, video calls, help center, and marketing automation — a full-stack Intercom alternative you run on your own infrastructure.

View details
54
Repo Health
66
Technical
67
Dependency
Built with
TypeScript 53%
Ruby 36%
Updated 4 months ago
Java
49%
Apache 2.0

ClearFlask

Community · Product Management

450

Open-source feedback management and roadmap tool that lets product teams collect, prioritize, and respond to user input — with AI-powered summarization and full self-hosting control.

View details
82
Repo Health
73
Technical
62
Dependency
Built with
Java 49%
TypeScript 46%
Updated 2 weeks ago
JavaScript
83%
Other

Countly

Analytics · Marketing

5,921

Privacy-first, self-hosted analytics and customer engagement platform with full data ownership, GDPR compliance, and AI-powered insights across mobile, web, desktop, and IoT.

View details
96
Repo Health
82
Technical
65
Dependency
Built with
JavaScript 83%
Updated 1 weeks ago
PHP
48%
AGPL 3.0

Crater

Invoicing Finance

8,355

Open source invoicing and billing platform for freelancers and small businesses — create estimates, track expenses, accept Stripe payments, and run recurring invoices from your own server.

View details
54
Repo Health
68
Technical
66
Dependency
Built with
PHP 48%
Vue 40%
Updated 2 years ago
Ruby
61%
GPL 2.0

Discourse

Community

48,001

Open-source community platform with dynamic trust levels, real-time chat, and a powerful plugin architecture for self-hosted forums.

View details
89
Repo Health
89
Technical
67
Dependency
Built with
Ruby 61%
JavaScript 32%
Updated 6 days ago
PHP
66%
AGPL 3.0

EspoCRM

CRM · Ecommerce · Marketing

3,514

Open-source CRM platform with metadata-driven customization, field-level permissions, and a full REST API — deploy on your own infrastructure.

View details
97
Repo Health
72
Technical
64
Dependency
Built with
PHP 66%
JavaScript 23%
Updated 1 weeks ago
Go
38%
MIT

ezBookkeeping

Invoicing Finance

5,814

Lightweight self-hosted personal finance manager with AI receipt scanning, multi-currency support, and MCP integration for complete data privacy.

View details
88
Repo Health
80
Technical
71
Dependency
Built with
Go 38%
Vue 33%
TypeScript 25%
Updated 1 weeks ago

Join founders buildingwith open source

Opinionated takes, migration guides, cost-saving tips, and insights from the open source ecosystem.

Subscribe on Substack
Join 750+ subscribers