PersianDate.fromDateTime constructor

PersianDate.fromDateTime(
  1. DateTime date
)

Creates a PersianDate from the equivalent DateTime.

Implementation

factory PersianDate.fromDateTime(DateTime date) {
  final julianDayNumber =
      _getJulianDayNumber(date.year, date.month, date.day);
  final int year = date.year;
  int persianYear = year - 621;
  final r = _PersianDateCalculation.calculate(persianYear);
  final int jdn1f = _getJulianDayNumber(year, 3, r.march);
  int k = julianDayNumber - jdn1f;
  // Find number of days that passed since 1 Farvardin.
  if (k >= 0) {
    if (k <= 185) {
      // The first 6 months.
      final int jm = 1 + (k ~/ 31);
      final int jd = (k % 31) + 1;

      return PersianDate(persianYear, jm, jd);
    } else {
      // The remaining months.
      k -= 186;
    }
  } else {
    // Previous Persian year.
    persianYear -= 1;
    k += 179;
    if (r.leap == 1) k += 1;
  }
  final int jm = 7 + (k ~/ 30);
  final int jd = (k % 30) + 1;

  return PersianDate(persianYear, jm, jd);
}