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