invoice/lib/utils/dates.dart

52 lines
1.2 KiB
Dart

import 'dart:math';
const _daysInMonth = const [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
bool isLeapYear(int value) =>
value % 400 == 0 || (value % 4 == 0 && value % 100 != 0);
int daysInMonth(int year, int month) {
var result = _daysInMonth[month];
if (month == 2 && isLeapYear(year)) {
result++;
}
return result;
}
DateTime addYears(DateTime dateTime, int offset) {
return DateTime.utc(dateTime.year + offset, dateTime.month, dateTime.day);
}
DateTime addMonths(DateTime dateTime, int offset) {
final r = offset % 12;
final q = (offset - r) ~/ 12;
var newYear = dateTime.year + q;
var newMonth = dateTime.month + r;
if (newMonth > 12) {
newYear++;
newMonth -= 12;
}
final newDay = min(dateTime.day, daysInMonth(newYear, newMonth));
if (dateTime.isUtc) {
return new DateTime.utc(
newYear,
newMonth,
newDay,
dateTime.hour,
dateTime.minute,
dateTime.second,
dateTime.millisecond,
dateTime.microsecond);
} else {
return new DateTime(
newYear,
newMonth,
newDay,
dateTime.hour,
dateTime.minute,
dateTime.second,
dateTime.millisecond,
dateTime.microsecond);
}
}