convertDaysToYearsAndMonths static method
Returns a human-readable string representing days as years, months,
and optionally remaining days, or null if days is null or less
than 1.
This method uses average values that account for leap years:
- Average days per year: 365.25 (accounts for leap years)
- Average days per month: 30.4375 (365.25 / 12)
If includeRemainingDays is true, includes remaining days in the
output when they don't form a complete month.
Note: Output uses English plural rules only.
Example:
convertDaysToYearsAndMonths(400); // '1 year and 1 month'
convertDaysToYearsAndMonths(365); // '1 year'
convertDaysToYearsAndMonths(45); // '1 month'
convertDaysToYearsAndMonths(45, includeRemainingDays: true); // '1 month and 14 days'
convertDaysToYearsAndMonths(10); // '0 days'
convertDaysToYearsAndMonths(10, includeRemainingDays: true); // '10 days'
Implementation
@useResult
static String? convertDaysToYearsAndMonths(
int? days, {
bool includeRemainingDays = false,
}) {
if (days == null || days < 1) {
return null;
}
final int years = (days / _avgDaysPerYear).floor();
double remainingDays = days - (years * _avgDaysPerYear);
final int months = (remainingDays / _avgDaysPerMonth).floor();
remainingDays -= months * _avgDaysPerMonth;
final int remainingDaysInt = remainingDays.round();
final List<String> parts = _buildDurationParts(
years: years,
months: months,
remainingDaysInt: remainingDaysInt,
includeRemainingDays: includeRemainingDays,
);
if (parts.isEmpty) {
if (!includeRemainingDays || remainingDaysInt <= 0) {
return _zeroDays;
}
final String dayStr = _pluralLabel(
count: remainingDaysInt,
singular: _dayLabel,
plural: _daysLabel,
);
return '$remainingDaysInt $dayStr';
}
return _joinWithAnd(parts);
}