date-fns

Modern JavaScript date utility library with 200+ pure, immutable functions

Library
npm
v4.4.0
36,649 stars
MIT License

Repository Health

Pre-computed score based on development activity, maintenance, community, maturity, and trend momentum. How we score it →
76 /100 Good
Development Activity 64
Maintenance 72
Community 68
Maturity 60
Momentum 40

Technical Analysis

AI-assessed by reading the actual repository — architecture, code quality, innovation, and documentation. How we score it →
86 /100 Excellent
Architecture 90
Code Quality 92
Innovation 85
Learning Curve 78

date-fns is a modular, TypeScript-first utility library that provides more than 200 pure functions for parsing, formatting, comparing, and manipulating JavaScript dates. Rather than extending the native Date prototype, every function accepts and returns plain Date instances, keeping behavior predictable and safe to mix with other libraries.

Each function lives in its own submodule, so bundlers can tree-shake unused code and applications only ship the date logic they actually import. The library ships first-class time zone support through companion packages (@date-fns/tz and @date-fns/utc), dozens of locales for internationalized formatting, and an opt-in functional-programming (fp) variant for point-free composition.

What You Get

  • 200+ granular functions (add/sub, compare, diff, format, parse, start/end-of-period, and more), each independently importable
  • First-class, immutable time zone handling via the companion @date-fns/tz (TZDate) and @date-fns/utc (UTCDate) packages
  • Dozens of locale packs for internationalized month/day names, relative-time phrasing, and formatting
  • A functional-programming build (date-fns/fp) with curried, data-last function signatures for composition
  • Full TypeScript definitions generated alongside the source, with generics that preserve custom Date subclasses through the call chain

Common Use Cases

  • Formatting and parsing dates for display in web and Node.js applications
  • Computing durations, differences, and business-day math (e.g. invoice due dates, SLA windows)
  • Normalizing and comparing dates across time zones in scheduling or booking systems
  • Building calendar and date-picker UI components that need start/end-of-period helpers
  • Localizing date and relative-time strings for internationalized products

Under The Hood

Architecture

date-fns is organized as a pnpm monorepo (pkgs/core, pkgs/tz, pkgs/utc, pkgs/docs, pkgs/dev) where the npm date-fns package maps to pkgs/core. Inside pkgs/core/src, each of the 253 exported functions (e.g. addDays, format, differenceInCalendarDays) lives in its own directory with an index.ts implementation and a colocated test.ts, giving the library a flat, highly navigable structure instead of a monolithic module. Cross-cutting behavior is centralized in _lib (formatters, default locale/options, protected-token warnings) and in toDate/constructFrom, which every function routes Date arguments through; constructFrom inspects a Symbol.for("constructDateFrom") on the reference date to decide which constructor to use, which is the mechanism that lets the separate @date-fns/tz (TZDate) and @date-fns/utc (UTCDate) packages plug into the same generic function set without date-fns/core depending on them directly. A parallel src/fp tree (399 files) wraps the same functions in curried, data-last signatures for functional-style composition, and src/locale (98 entries) supplies per-locale formatting data consumed by format/formatDistance at the _lib layer.

Tech Stack

The project is TypeScript-first (96%+ of the codebase) targeting both ESM (index.js) and CJS (index.cjs) output, declared via exports maps with one subpath per function for granular imports and tree-shaking. Tooling is notably modern: oxlint/oxfmt (Rust-based lint/format, replacing ESLint/Prettier) with oxlint-tsgolint for TypeScript-aware linting, @typescript/native-preview (the Go-based tsgo compiler preview), vitest for the test runner, and mise for task/toolchain orchestration in place of npm scripts. The package has zero runtime dependencies, keeping the dependency footprint minimal for consumers. Companion packages @date-fns/tz and @date-fns/utc are versioned and published separately from core within the same monorepo.

Code Quality

Test coverage is essentially 1:1 with the public API: 253 test.ts files sit alongside 253 function implementations in pkgs/core/src, and tests (e.g. addDays/test.ts) cover not just nominal behavior but DST-transition edge cases via a shared getDstTransitions helper and cross-checks against the @date-fns/tz/@date-fns/utc extension types using assertType. Functions are consistently small and single-purpose (most implementation files are well under 50 lines), naming is systematic across the whole API surface (addX/subX, differenceInX, startOfX/endOfX, isX), and every export carries a structured JSDoc block (@summary, @param, @returns, @example) that doubles as the source for the published docs site. Invalid input is handled explicitly and predictably — e.g. addDays short-circuits to NaN-dated output via constructFrom when passed a NaN amount rather than throwing or silently producing a wrong date.

API Design

The API favors small, guessable, single-purpose functions over a chained or class-based interface, which keeps the learning curve shallow for any one function while the sheer surface area (200+ exports) is the main ramp-up cost for the full library. Getting started requires zero boilerplate: import { format } from "date-fns"; format(new Date(), "yyyy-MM-dd") is a complete, working example, and every function’s JSDoc ships a runnable @example. Consistent naming conventions (addX/subX, isX, startOfX) mean that once a developer learns one family of functions, the rest are largely inferable. The optional options?.in context parameter and generic DateType/ResultDate type parameters let advanced users opt into time zone-aware types without imposing that complexity on basic usage, and the separate fp entry point serves functional-style consumers without complicating the default API.

Used by 215 apps in this directory

TypeScript
56%
MIT

open-notebook

AI Assistants · Note Taking

40,014

A privacy-first, self-hosted AI research notebook with 18+ model providers, multi-speaker podcast generation, and full REST API—your open-source alternative to Google Notebook LM.

View details
89
Repo Health
84
Technical
71
Dependency
Built with
TypeScript 56%
Python 42%
Updated 5 days ago
TypeScript
96%

Open Scouts

AI Agents · Automation

1,374

Create automated AI scouts that continuously search the web and send email alerts when they find what you're looking for.

View details
33
Repo Health
65
Technical
69
Dependency
Built with
TypeScript 96%
Updated 4 months ago
TypeScript
83%
AGPL 3.0

OpenStatus

Devops · Monitoring

9,178

Open-source status pages and uptime monitoring with global synthetic checks, monitoring-as-code, and AI agent integration via MCP.

View details
77
Repo Health
82
Technical
69
Dependency
Built with
TypeScript 83%
MDX 14%
Updated yesterday
TypeScript
83%
AGPL 3.0

OpenStatus

Devops · Monitoring

9,178

Open-source status pages and uptime monitoring with global synthetic checks, monitoring-as-code, and AI agent integration via MCP.

View details
77
Repo Health
82
Technical
69
Dependency
Built with
TypeScript 83%
MDX 14%
Updated yesterday
Python
100%
Other

OpenBB

Analytics · Databases · Invoicing Finance

74,041

The AI Workspace for Finance: Connect Data, Run AI Agents, Build Analytics

View details
75
Repo Health
80
Technical
66
Dependency
Built with
Python 100%
Updated 1 weeks ago
TypeScript
84%
MIT

OpenCut

Design Tools · Social Media · Video Editors

93,371

Free, open-source video editor for web, desktop, and mobile — no watermarks, no subscriptions, built with a Rust core and plugin-first architecture

View details
72
Repo Health
67
Technical
84
Dependency
Built with
TypeScript 84%
Rust 14%
Updated 2 weeks ago
TypeScript
39%
AGPL 3.0

OpenObserve

Analytics · Devops · Monitoring

22,312

Open source observability platform for logs, metrics, traces, and real user monitoring — delivering 140x lower storage costs than Elasticsearch with a single binary you can run in under 2 minutes.

View details
90
Repo Health
9
Technical
71
Dependency
Built with
TypeScript 39%
Rust 30%
Vue 17%
Updated today
TypeScript
88%
AGPL 3.0

OpenPanel

Analytics

7,111

Open-source Mixpanel alternative with session replay, MCP integration, and privacy-first product analytics you fully control.

View details
75
Repo Health
74
Technical
65
Dependency
Built with
TypeScript 88%
MDX 10%
Updated yesterday
TypeScript
93%
Apache 2.0

Openship

Devops · Hosting Control Panel

14,642

Openship is an open-source, self-hostable deployment platform that points at a repo and builds, ships, routes, and TLS-terminates the app — driven from a desktop app, web dashboard, or CLI.

View details
84
Repo Health
85
Technical
65
Dependency
Built with
TypeScript 93%
Updated today

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