solarToGregorian method

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

Implementation

dynamic solarToGregorian(int y, int m, int d, [String? separator]) {
  int gY;
  var inY = y;
  if (inY > 979) {
    gY = 1600;
    inY -= 979;
  } else {
    gY = 621;
  }

  var days = (365 * inY) +
      ((inY / 33).floor() * 8) +
      (((inY % 33) + 3) / 4) +
      78 +
      d +
      (m < 7 ? (m - 1) * 31 : ((m - 7) * 30) + 186);
  gY += 400 * (days ~/ 146097);
  days %= 146097;
  if (days.floor() > 36524) {
    gY += 100 * (--days ~/ 36524);
    days %= 36524;
    if (days >= 365) {
      days++;
    }
  }
  gY += 4 * (days ~/ 1461);
  days %= 1461;
  gY += (days - 1) ~/ 365;

  if (days > 365) {
    days = (days - 1) % 365;
  }
  var gD = (days + 1).floor();
  final montDays = [
    0,
    31,
    if ((gY % 4 == 0 && gY % 100 != 0) || gY % 400 == 0) 29 else 28,
    31,
    30,
    31,
    30,
    31,
    31,
    30,
    31,
    30,
    31
  ];
  var i = 0;
  for (; i <= 12; i++) {
    if (gD <= montDays[i]) {
      break;
    }
    gD -= montDays[i];
  }
  dynamic gregorianDate;
  if (separator == null) {
    gregorianDate = [gY, i, gD];
  } else {
    gregorianDate = '$gY$separator$i$separator$gD';
  }
  return gregorianDate;
}