gregorianToJalali method

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

Implementation

gregorianToJalali(int y, int m, int d, [String? separator]) {
  int differenceBetweenDays = 0;

  int date = 0;
  int year = 0;

  int gregorianYear = y;
  int gregorianMonth = m;
  int gregorianDay = d;
  List notLeapYear = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334];
  List isLeapYear = [0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335];
  num month;
  if ((gregorianYear % 4) != 0) {
    date = notLeapYear[gregorianMonth - 1] + gregorianDay;
    if (date > 79) {
      date = date - 79;
      if (date <= 186) {
        switch (date % 31) {
          case 0:
            month = date / 31;
            date = 31;
            break;
          default:
            month = (date / 31) + 1;
            date = (date % 31);
            break;
        }
        year = gregorianYear - 621;
      } else {
        date = date - 186;

        switch (date % 30) {
          case 0:
            month = (date / 30) + 6;
            date = 30;
            break;
          default:
            month = (date / 30) + 7;
            date = (date % 30);
            break;
        }
        year = gregorianYear - 621;
      }
    } else {
      if ((gregorianYear > 1996) && (gregorianYear % 4) == 1) {
        differenceBetweenDays = 11;
      } else {
        differenceBetweenDays = 10;
      }
      date = date + differenceBetweenDays;

      switch (date % 30) {
        case 0:
          month = (date / 30) + 9;
          date = 30;
          break;
        default:
          month = (date / 30) + 10;
          date = (date % 30);
          break;
      }
      year = gregorianYear - 622;
    }
  } else {
    date = isLeapYear[gregorianMonth - 1] + gregorianDay;

    if (gregorianYear >= 1996) {
      differenceBetweenDays = 79;
    } else {
      differenceBetweenDays = 80;
    }
    if (date > differenceBetweenDays) {
      date = date - differenceBetweenDays;

      if (date <= 186) {
        switch (date % 31) {
          case 0:
            month = (date / 31);
            date = 31;
            break;
          default:
            month = (date / 31) + 1;
            date = (date % 31);
            break;
        }
        year = gregorianYear - 621;
      } else {
        date = date - 186;

        switch (date % 30) {
          case 0:
            month = (date / 30) + 6;
            date = 30;
            break;
          default:
            month = (date / 30) + 7;
            date = (date % 30);
            break;
        }
        year = gregorianYear - 621;
      }
    } else {
      date = date + 10;

      switch (date % 30) {
        case 0:
          month = (date / 30) + 9;
          date = 30;
          break;
        default:
          month = (date / 30) + 10;
          date = (date % 30);
          break;
      }
      year = gregorianYear - 622;
    }
  }
  var persianDate;
  if (separator == null)
    persianDate = [year, month.floor(), date];
  else
    persianDate = "$year$separator${month.floor()}$separator$date";
  return persianDate;
}