moment-hijri-plus/README.md
Aric Camarata c6e9a49d19 fix: convert the displayed calendar date in toHijri for hijri-core's UTC-day contract
moment.fn.toHijri now passes new Date(Date.UTC(this.year(), this.month(), this.date()))
to hijri-core instead of the raw instant (this.toDate()). This converts the calendar
date the moment instance displays, respecting utc() mode, rather than the underlying
millisecond value — eliminating wrong-Hijri-day results around UTC-midnight for hosts
east or west of UTC.

Lock-step with hijri-core fix/utc-day-boundary (commit 3419378). fromHijri path
was already correct; its comment updated for clarity.
2026-06-10 16:35:48 -04:00

3.1 KiB

moment-hijri-plus

npm version CI License: MIT

Moment.js plugin for Hijri calendar conversion and formatting. Delegates all calendar logic to hijri-core, a zero-dependency Hijri engine with pluggable calendar support (Umm al-Qura and FCNA/ISNA).

Installation

pnpm add moment moment-hijri-plus hijri-core

Both moment and hijri-core are peer dependencies.

Quick Start

import moment from 'moment';
import installHijri from 'moment-hijri-plus';

installHijri(moment);

const m = moment(new Date(2023, 2, 23)); // 23 March 2023
m.toHijri();            // { hy: 1444, hm: 9, hd: 1 }  (1 Ramadan 1444 AH)
m.formatHijri('iD iMMMM iYYYY AH'); // '1 Ramadan 1444 AH'

moment.fromHijri(1446, 1, 1); // moment for 7 July 2024

API Summary

Call installHijri(moment) once at startup to add these methods.

Method Returns Description
toHijri(options?) HijriDate | null Convert to Hijri date object
hijriYear(options?) number | null Hijri year
hijriMonth(options?) number | null Hijri month (1-12)
hijriDay(options?) number | null Hijri day
isValidHijri(options?) boolean True if date is within calendar range
formatHijri(fmt, options?) string Format with Hijri tokens; non-Hijri tokens pass through
moment.fromHijri(hy, hm, hd, options?) Moment Construct moment from Hijri date

Pass { calendar: 'fcna' } to switch from the default Umm al-Qura calendar to FCNA/ISNA.

Full API reference, format token table, and examples are in the project wiki.

Day boundaries and time zones

Conversions use the calendar date the moment instance displays, not the underlying UTC instant. A moment("2025-03-01") parsed in any local timezone returns the Hijri date for March 1st, 2025. A moment created with .utc() uses its UTC components.

Religious day-start at sunset is outside the scope of this package; it depends on location and madhab, and must be handled at the application layer.

Note on Moment.js

Moment.js is in maintenance mode. For new projects, dayjs-hijri-plus offers the same Hijri support on Day.js. This package targets existing codebases already using Moment.js.

License

MIT. Copyright (c) 2026 Aric Camarata.