hijri-core-dart/.github/wiki/guides/advanced.md
2026-05-29 06:34:30 -04:00

1.6 KiB

Advanced Usage

Selecting a Calendar Engine

The default engine is Umm al-Qura (UAQ). Switch to FCNA for North American Islamic Society dates:

import 'package:hijri_core/hijri_core.dart';

void main() {
  final date = DateTime.utc(2025, 3, 1);

  final uaq = toHijri(date, calendar: 'uaq');
  final fcna = toHijri(date, calendar: 'fcna');

  print('UAQ:  ${uaq?.hy}/${uaq?.hm}/${uaq?.hd}');
  print('FCNA: ${fcna?.hy}/${fcna?.hm}/${fcna?.hd}');
}

Listing Available Calendars

final calendars = listCalendars();
print(calendars); // ['uaq', 'fcna']

final engine = getCalendar('uaq');
print(engine.name); // 'Umm al-Qura'

Custom Engine

Implement CalendarEngine to plug in your own calendar algorithm:

import 'package:hijri_core/hijri_core.dart';

class MyCalendarEngine implements CalendarEngine {
  @override
  String get id => 'my-calendar';

  @override
  String get name => 'My Custom Calendar';

  @override
  HijriDate? toHijri(DateTime gregorian) {
    // Your conversion logic here
    return null;
  }

  @override
  DateTime? toGregorian(int hy, int hm, int hd) {
    // Your reverse conversion logic here
    return null;
  }

  @override
  int daysInMonth(int hy, int hm) => 30; // simplified

  @override
  bool isValid(int hy, int hm, int hd) => hm >= 1 && hm <= 12 && hd >= 1 && hd <= 30;
}

// Register and use
registerCalendar(MyCalendarEngine());
final result = toHijri(DateTime.utc(2025, 3, 1), calendar: 'my-calendar');

Ramadan Detection

bool isRamadan(DateTime date) {
  final hijri = toHijri(date);
  return hijri != null && hijri.hm == 9;
}