Working with Dates in JavaScript (Node.js): Overview of Popular Libraries
Working with dates and times is one of the most common tasks in web development. The built-in Date object in JavaScript (Node.js) provides basic capabilities, but often proves inconvenient and limited: lack of convenient formatting, parsing, time zone manipulations, and date differences. Fortunately, there are several mature libraries that solve these problems. In this article, we will look at four of the most popular tools for working with dates in Node.js.
1. Moment.js — A Classic (With Caveats)
Moment.js was the de facto standard for working with dates in JavaScript for a long time. It provides a rich API for parsing, validation, formatting, and date manipulations.
Installation:
npm install momentUsage Example:
const moment = require('moment');
// Current date and timeconst now = moment();console.log(now.format('YYYY-MM-DD HH:mm:ss')); // 2025-03-21 14:30:00
// Parsing a stringconst date = moment('2025-12-25', 'YYYY-MM-DD');console.log(date.format('dddd, MMMM Do YYYY')); // Thursday, December 25th 2025
// Manipulationsconst future = moment().add(7, 'days').subtract(2, 'hours');console.log(future.fromNow()); // "in 6 days"
// Difference between datesconst a = moment('2025-01-01');const b = moment('2025-03-21');console.log(b.diff(a, 'days')); // 79Pros: huge community, detailed documentation, many plugins (time zone support, localization).
Cons: the library is outdated (maintenance mode), large size (~230 KB), mutating methods (modify the original object). Developers recommend using modern alternatives.
2. date-fns — Modular and Functional Approach
date-fns is a modern library built on functional programming principles. Each function is a separate module, allowing you to import only the needed parts and reduce bundle size.
Installation:
npm install date-fnsUsage Example:
const { format, addDays, subHours, differenceInDays, parseISO } = require('date-fns');
// Formattingconst now = new Date();console.log(format(now, 'yyyy-MM-dd HH:mm:ss')); // 2025-03-21 14:30:00
// Manipulations (immutable — creates a new object)const future = addDays(now, 7);const adjusted = subHours(future, 2);console.log(format(adjusted, 'dd.MM.yyyy')); // 28.03.2025
// Differenceconst start = parseISO('2025-01-01');const end = new Date();console.log(differenceInDays(end, start)); // 79
// Localization (Russian)const { ru } = require('date-fns/locale');console.log(format(now, 'PPPP', { locale: ru })); // "пятница, 21 марта 2025 г."Pros: modularity, immutability (does not modify original objects), TypeScript support, excellent documentation.
Cons: requires Node.js 14+, no built-in time zone support (requires date-fns-tz).
3. Day.js — Lightweight and Fast Alternative to Moment.js
Day.js is a minimalist library (only 2 KB) with an API almost fully compatible with Moment.js. It is ideal if you need to replace Moment.js without rewriting code.
Installation:
npm install dayjsUsage Example:
const dayjs = require('dayjs');const utc = require('dayjs/plugin/utc');const relativeTime = require('dayjs/plugin/relativeTime');
dayjs.extend(utc);dayjs.extend(relativeTime);
// Basic usage (like in Moment)const now = dayjs();console.log(now