No description
Find a file
2026-06-13 11:52:28 -04:00
.github docs: update TypeDoc sidebar and CI coverage job (pending from prior wave) 2026-05-30 18:32:26 -04:00
src fix: local-day adapter semantics with exact round-trips on hijri-core's UTC-day contract 2026-06-10 16:38:32 -04:00
.editorconfig refactor: code quality improvements across the board 2026-03-08 11:37:32 -04:00
.gitignore fix: local-day adapter semantics with exact round-trips on hijri-core's UTC-day contract 2026-06-10 16:38:32 -04:00
.npmrc chore: clear .npmrc to remove pnpm-only key that warns on npm publish 2026-02-25 15:09:06 -05:00
.nvmrc feat: initial release of date-fns-hijri v1.0.0 2026-02-25 14:15:24 -05:00
CHANGELOG.md chore: bump to v1.0.4 2026-06-13 11:52:28 -04:00
date-fns-hijri.test.ts fix: local-day adapter semantics with exact round-trips on hijri-core's UTC-day contract 2026-06-10 16:38:32 -04:00
eslint.config.mjs ci: fix eslint config files pattern, add @typescript-eslint direct devDeps, fix prettier formatting 2026-05-31 08:47:50 -04:00
LICENSE feat: initial release of date-fns-hijri v1.0.0 2026-02-25 14:15:24 -05:00
package.json chore: bump to v1.0.4 2026-06-13 11:52:28 -04:00
pnpm-lock.yaml chore: update hijri-core to 1.0.3 2026-06-10 16:49:33 -04:00
pnpm-workspace.yaml feat: initial release of date-fns-hijri v1.0.0 2026-02-25 14:15:24 -05:00
README.md fix: local-day adapter semantics with exact round-trips on hijri-core's UTC-day contract 2026-06-10 16:38:32 -04:00
test-cjs.cjs fix: local-day adapter semantics with exact round-trips on hijri-core's UTC-day contract 2026-06-10 16:38:32 -04:00
test.mjs fix: local-day adapter semantics with exact round-trips on hijri-core's UTC-day contract 2026-06-10 16:38:32 -04:00
tsconfig.json chore: adopt shared config packages (tsconfig, eslint, prettier) 2026-05-30 15:09:58 -04:00
tsup.config.ts ci: pin pnpm to version 10 in all CI jobs 2026-03-08 16:37:38 -04:00
typedoc.json docs: add TypeDoc API generation (typedoc@0.28.19 + typedoc-plugin-markdown@4.11.0) 2026-05-30 16:41:59 -04:00
vitest.config.ts fix: local-day adapter semantics with exact round-trips on hijri-core's UTC-day contract 2026-06-10 16:38:32 -04:00

date-fns-hijri

npm version CI License: MIT

date-fns-style functions for Hijri calendar operations. Each function is a pure, stateless utility. Pass a Date, get a result. No classes, no global configuration.

Built on hijri-core. Supports Umm al-Qura (UAQ) and FCNA/ISNA calendar systems.

Installation

pnpm add date-fns-hijri hijri-core

hijri-core is a peer dependency. It provides the underlying calendar engine.

Quick Start

import {
  toHijriDate,
  fromHijriDate,
  formatHijriDate,
  addHijriMonths,
  getHijriMonthName,
} from 'date-fns-hijri';

// Convert Gregorian to Hijri
const hijri = toHijriDate(new Date(2023, 2, 23, 12));
// { hy: 1444, hm: 9, hd: 1 } (1 Ramadan 1444)

// Format with Hijri tokens
const label = formatHijriDate(new Date(2023, 2, 23, 12), 'iD iMMMM iYYYY ioooo');
// '1 Ramadan 1444 AH'

// Add Hijri months
const eid = addHijriMonths(new Date(2023, 2, 23, 12), 1);
// Date in Shawwal 1444

// Get the month name
getHijriMonthName(9); // 'Ramadan'

Documentation

Full API reference, guides, and examples: Wiki

Day boundaries and time zones

This package follows date-fns local-time conventions:

  • Inputs (toHijriDate, getHijri*, formatHijriDate, arithmetic, comparisons) — the input Date is read by its local calendar day (using getFullYear/getMonth/getDate). This matches how date-fns' own format() and field accessors work.
  • Outputs (fromHijriDate and all arithmetic/boundary functions) — returned Date values are local midnight of the equivalent Gregorian day. Local field accessors and date-fns' format() will render the intended date on every timezone.

Round-trips are exact on every host timezone:

toHijriDate(fromHijriDate(1446, 9, 1)); // always { hy: 1446, hm: 9, hd: 1 }

Pitfall: new Date("2025-03-01") parses as UTC midnight. In timezones west of UTC this resolves to the previous local day (Feb 28), giving an off-by-one result. Use the local-date constructor instead:

// Wrong in timezones west of UTC:
toHijriDate(new Date("2025-03-01")); // may return 29 Shaban in some zones

// Correct everywhere:
toHijriDate(new Date(2025, 2, 1)); // always 1 Ramadan 1446

Religious day-start (sunset boundary) is out of scope — this package only handles civil calendar day alignment.

Compatibility

  • Node.js 20, 22, 24
  • ESM and CJS builds included
  • TypeScript definitions bundled
  • Works in browsers and all major bundlers

License

MIT. Copyright (c) 2026 Aric Camarata.