gregorianToSolar method

dynamic gregorianToSolar(
  1. int y,
  2. int m,
  3. int d, [
  4. String? separator,
])

Implementation

dynamic gregorianToSolar(int y, int m, int d, [String? separator]) {
  final sumMonthDay = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334];
  var jY = 0;
  var inY = y;
  if (inY > 1600) {
    jY = 979;
    inY -= 1600;
  } else {
    jY = 0;
    inY -= 621;
  }
  final gy = (m > 2) ? inY + 1 : inY;
  var day = (365 * inY) +
      ((gy + 3) ~/ 4) -
      ((gy + 99) ~/ 100) +
      ((gy + 399) ~/ 400) -
      80 +
      d +
      sumMonthDay[m - 1];
  jY += 33 * (day.round() / 12053).floor();
  day %= 12053;
  jY += 4 * (day.round() / 1461).floor();
  day %= 1461;
  jY += ((day.round() - 1) / 365).floor();
  if (day > 365) {
    day = (day - 1).round() % 365;
  }
  int jm;
  int jd;
  final days = day.toInt();
  if (days < 186) {
    jm = 1 + (days ~/ 31);
    jd = 1 + (days % 31);
  } else {
    jm = 7 + ((days - 186) ~/ 30);
    jd = 1 + (days - 186) % 30;
  }
  var persianDate;
  if (separator == null) {
    persianDate = [jY, jm, jd];
  } else {
    persianDate = '$jY$separator$jm$separator$jd';
  }
  return persianDate;
}