48 lines
1.3 KiB
Dart
48 lines
1.3 KiB
Dart
/// 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<int> daysInMonth = <int>[
|
|
31,
|
|
-1,
|
|
31,
|
|
30,
|
|
31,
|
|
30,
|
|
31,
|
|
31,
|
|
30,
|
|
31,
|
|
30,
|
|
31,
|
|
];
|
|
return daysInMonth[month - 1];
|
|
}
|
|
}
|