/// Utility functions for working with dates. class DateUtils { /// Returns a [DateTime] that is [monthDate] with the added number /// of months and the day set to 1 and time set to midnight. /// /// For example: /// /// ```dart /// DateTime date = DateTime(2019, 1, 15); /// DateTime futureDate = DateUtils.addMonthsToMonthDate(date, 3); /// ``` /// /// `date` would be January 15, 2019. /// `futureDate` would be April 1, 2019 since it adds 3 months. static DateTime addMonthsToMonthDate( final DateTime monthDate, final int monthsToAdd, ) => DateTime(monthDate.year, monthDate.month + monthsToAdd); /// Returns the number of days in a month, according to the proleptic /// Gregorian calendar. /// /// This applies the leap year logic introduced by the Gregorian reforms of /// 1582. It will not give valid results for dates prior to that time. static int getDaysInMonth(final int year, final int month) { if (month == DateTime.february) { final bool isLeapYear = (year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0); return isLeapYear ? 29 : 28; } const List daysInMonth = [ 31, -1, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, ]; return daysInMonth[month - 1]; } }