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
51%
ZLIB

Portainer

Devops

38,707

A lightweight, open-source web UI that puts Docker, Kubernetes, and Podman management within reach of any team—no CLI expertise required.

View details
93
Repo Health
79
Technical
65
Dependency
Built with
TypeScript 51%
Go 38%
Updated 1 weeks ago
JavaScript
50%
AGPL 3.0

QRev

AI Agents · CRM

364

Open source AI-first sales platform that replaces Salesforce with autonomous agents handling prospecting, outreach, and lead management at scale.

View details
39
Repo Health
68
Technical
64
Dependency
Built with
JavaScript 50%
Python 28%
TypeScript 14%
Updated 8 months ago
TypeScript
97%
Other

Rocket.Chat

Team Chat

46,304

The secure, self-hosted team communications platform for organizations that cannot compromise on data sovereignty.

View details
96
Repo Health
79
Technical
63
Dependency
Built with
TypeScript 97%
Updated 6 days ago
JavaScript
86%
AGPL 3.0

SillyTavern

AI Assistants

34,869

The power-user LLM frontend that unifies dozens of AI backends with a rich scripting engine, immersive Visual Novel mode, and a thriving extension ecosystem.

View details
88
Repo Health
71
Technical
63
Dependency
Built with
JavaScript 86%
Updated 4 weeks ago
Rust
93%
Other

Tabby

AI Code Assistants

33,924

Self-hosted AI coding assistant — run GitHub Copilot-grade code completion on your own hardware with no cloud dependency.

View details
55
Repo Health
78
Technical
61
Dependency
Built with
Rust 93%
Updated 4 months ago
HTML
68%
AGPL 3.0

ToolJet

AI Agents · Low Code Platforms · No Code Platforms

41,123

Open-source AI-native platform to build and deploy internal tools, workflows, and AI agents with a visual drag-and-drop builder and 80+ data source integrations.

View details
94
Repo Health
81
Technical
63
Dependency
Built with
HTML 68%
JavaScript 20%
Updated 6 days ago
TypeScript
41%
AGPL 3.0

Wiki.js

Collaboration · Knowledge Management

29,081

A modern, self-hosted wiki platform built on Node.js with a rich plugin ecosystem for authentication, search, storage, and rendering that adapts to any team's infrastructure.

View details
95
Repo Health
67
Technical
60
Dependency
Built with
TypeScript 41%
Vue 39%
JavaScript 16%
Updated 6 days ago
TypeScript
72%
AGPL 3.0

Worklenz

Collaboration · Product Management · Project Management

3,259

All-in-one open source project management for teams who want full control — plan projects, track tasks, manage resources, and monitor finances without the SaaS lock-in.

View details
87
Repo Health
7
Technical
64
Dependency
Built with
TypeScript 72%
JavaScript 21%
Updated 1 weeks ago
Go
74%
AGPL 3.0

ZITADEL

Authentication

15,418

Open-source, API-first identity platform delivering multi-tenancy, Passkeys, OIDC, SAML, and SCIM without vendor lock-in.

View details
92
Repo Health
81
Technical
65
Dependency
Built with
Go 74%
TypeScript 12%
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