-
Notifications
You must be signed in to change notification settings - Fork 0
index
Measured on Node 22, Apple M2. Input: 1,000 random dates in range 1900-2076 CE.
| Operation | UAQ calendar | FCNA calendar |
|---|---|---|
d.toHijri() |
~0.5 µs/call | ~14 µs/call |
d.iYear() |
~0.5 µs/call | ~14 µs/call |
dayjs.fromHijri() |
~0.6 µs/call | ~15 µs/call |
d.format('iD iMMMM iYYYY') |
~1.2 µs/call | ~15 µs/call |
UAQ uses a precomputed lookup table (O(1) lookup). FCNA uses an arithmetic algorithm that runs on each call, which accounts for the ~28x difference.
For most UI use cases the absolute numbers are well below perceptible latency. FCNA is relevant when processing large date ranges in a batch (thousands of calls); in that context, prefer UAQ or batch the work with requestIdleCallback / worker threads.
The plugin adds minimal weight on top of Day.js.
| Module | Min+gz |
|---|---|
| dayjs-hijri-plus (wrapper only) | ~1.5 KB |
| hijri-core/uaq (peer dep, UAQ engine) | ~5.3 KB |
| hijri-core/fcna (peer dep, FCNA engine) | ~3.1 KB |
| dayjs (peer dep, separate) | ~6.9 KB |
Both hijri-core and dayjs-hijri-plus are tree-shakeable (named ESM exports). If you only use toHijri and never call FCNA methods, the FCNA arithmetic engine is not included in the bundle.
import dayjs from 'dayjs';
import hijri from 'dayjs-hijri-plus';
dayjs.extend(hijri);
const dates = Array.from({ length: 1000 }, (_, i) =>
dayjs('1900-01-01').add(i * 26, 'day')
);
const start = performance.now();
for (const d of dates) {
d.toHijri();
}
const elapsed = performance.now() - start;
console.log(`${(elapsed / dates.length * 1000).toFixed(1)} µs/call`);Run with node --version >= 20. Results vary by machine and Node version.
dayjs-hijri-plus · MIT License · npm · Issues
Guides
Examples
Reference
API Pages
- plugin (default)
- toHijri
- isValidHijri
- hijriYear
- hijriMonth
- hijriDay
- formatHijri
- fromHijri
- registerCalendar
Community