gregorianToSolar method
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;
}