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

Python
55%
MIT

LibrePhotos

File Storage

8,111

Self-hosted photo library with AI-powered face recognition, semantic search, and automatic event albums — no cloud required.

View details
84
Repo Health
78
Technical
66
Dependency
Built with
Python 55%
TypeScript 43%
Updated 6 days ago
TypeScript
97%
Other

Lightdash

Analytics · Data Engineering

6,196

The open-source Looker alternative that turns your dbt project's metrics and dimensions into governed, self-serve charts and dashboards — no license key required.

View details
93
Repo Health
84
Technical
64
Dependency
Built with
TypeScript 97%
Updated 6 days ago
JavaScript
42%
Other

LimeSurvey

Forms Surveys

3,778

The world's most flexible open-source survey platform with 900+ templates, conditional logic, 80+ languages, and full GDPR compliance for any scale.

View details
86
Repo Health
62
Technical
62
Dependency
Built with
JavaScript 42%
PHP 36%
CSS 12%
Updated 6 days ago
Python
84%
MIT

LiteLLM

AI Development · Developer Tools

61,933

Open source AI gateway and Python SDK that gives you one OpenAI-compatible interface to call 100+ LLM providers, with built-in routing, cost tracking, guardrails, and virtual keys.

View details
93
Repo Health
81
Technical
69
Dependency
Built with
Python 84%
TypeScript 11%
Updated 6 days ago
PHP
81%
Other

Mautic

Automation · Ecommerce · Marketing

10,830

The world's largest open source marketing automation platform — own your data, run multi-channel campaigns, and escape vendor lock-in forever.

View details
98
Repo Health
76
Technical
63
Dependency
Built with
PHP 81%
Updated 1 weeks ago
Python
45%
GPL 3.0

MaxKB

AI Development · Knowledge Management

23,022

Build enterprise-grade AI agents with RAG, workflows & multi-modal support

View details
92
Repo Health
68
Technical
66
Dependency
Built with
Python 45%
Vue 37%
TypeScript 17%
Updated 1 weeks ago
Python
58%
Apache 2.0

MLflow

AI Development · Monitoring

28,512

The open source AI engineering platform for debugging, evaluating, monitoring, and optimizing production LLMs and agents at scale.

View details
96
Repo Health
86
Technical
67
Dependency
Built with
Python 58%
TypeScript 35%
Updated 6 days ago
TypeScript
49%
MIT

Nginx Proxy Manager

Developer Tools · Networking · Security

34,517

Manage Nginx reverse proxies and free Let's Encrypt SSL through a beautiful web interface — no Nginx expertise required.

View details
92
Repo Health
77
Technical
72
Dependency
Built with
TypeScript 49%
JavaScript 47%
Updated 1 weeks ago
TypeScript
96%
Apache 2.0

OneUptime

Monitoring

7,751

The complete open-source observability platform that replaces PagerDuty, Datadog, Sentry, and StatusPage with a single self-hostable system.

View details
91
Repo Health
81
Technical
65
Dependency
Built with
TypeScript 96%
Updated 6 days 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