From 452766a2b681511f7ce1383b78057c6ca68d3011 Mon Sep 17 00:00:00 2001 From: Chayan Mistry Date: Tue, 5 Sep 2023 15:36:41 +0600 Subject: [PATCH] Adjust months and years based on the days overflow --- README.md | 29 ++++++++++++++++++++++++++--- example/lib/main.dart | 25 ++++++++++++++++++++++++- lib/age_calculator.dart | 32 ++++++++++++++++++++++++++------ 3 files changed, 76 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 6e60e53..13b2925 100644 --- a/README.md +++ b/README.md @@ -53,10 +53,33 @@ void main() { // You next birthday will be in Years: 4, Months: 4, Days: 0 // Add time to any date - DateTime date = AgeCalculator.add( - date: DateTime(2021, 1, 2), - duration: DateDuration(years: 5, months: 2, days: 1)); + DateTime date; + + print('\nAdd Example:'); + date = AgeCalculator.add( + date: DateTime(2021, 1, 2), + duration: DateDuration(years: 5, months: 2, days: 1)); print(date); // 2026-03-03 00:00:00.000 + + date = AgeCalculator.add( + date: DateTime(2023, 2, 28), + duration: DateDuration(months: 6)); + print(date); + // 2024-02-29 00:00:00.000 + + // Subtract time to any date + print('\nSubtract Example:'); + date = AgeCalculator.subtract( + date: DateTime(2021, 1, 2), + duration: DateDuration(years: 5, months: 2, days: 1)); + print(date); + // 2015-11-01 00:00:00.000 + + date = AgeCalculator.subtract( + date: DateTime(2023, 8, 31), + duration: DateDuration(months: 6)); + print(date); + // 2023-02-28 00:00:00.000 } ``` diff --git a/example/lib/main.dart b/example/lib/main.dart index 46ec736..62ff036 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -33,9 +33,32 @@ void main() { // You next birthday will be in Years: 4, Months: 4, Days: 0 // Add time to any date - DateTime date = AgeCalculator.add( + DateTime date; + + print('\nAdd Example:'); + date = AgeCalculator.add( date: DateTime(2021, 1, 2), duration: DateDuration(years: 5, months: 2, days: 1)); print(date); // 2026-03-03 00:00:00.000 + + date = AgeCalculator.add( + date: DateTime(2023, 2, 28), + duration: DateDuration(months: 6)); + print(date); + // 2024-02-29 00:00:00.000 + + // Subtract time to any date + print('\nSubtract Example:'); + date = AgeCalculator.subtract( + date: DateTime(2021, 1, 2), + duration: DateDuration(years: 5, months: 2, days: 1)); + print(date); + // 2015-11-01 00:00:00.000 + + date = AgeCalculator.subtract( + date: DateTime(2023, 8, 31), + duration: DateDuration(months: 6)); + print(date); + // 2023-02-28 00:00:00.000 } diff --git a/lib/age_calculator.dart b/lib/age_calculator.dart index 8fd12c7..d019f7c 100644 --- a/lib/age_calculator.dart +++ b/lib/age_calculator.dart @@ -1,5 +1,7 @@ library age_calculator; +import 'dart:math'; + class DateDuration { int days; int months; @@ -95,13 +97,19 @@ class AgeCalculator { /// add method static DateTime add( {required DateTime date, required DateDuration duration}) { - int years = date.year + duration.years; - years += ((date.month + duration.months) ~/ DateTime.monthsPerYear); - int months = ((date.month + duration.months) % DateTime.monthsPerYear); - - int days = date.day + duration.days - 1; + var newDateTime = date.add(Duration(days: duration.days)); + newDateTime = _addMonths(newDateTime, duration.months); + newDateTime = _addMonths(newDateTime, duration.years * 12); + return newDateTime; + } - return DateTime(years, months, 1).add(Duration(days: days)); + /// subtract methods + static DateTime subtract( + {required DateTime date, required DateDuration duration}) { + var newDateTime = date.subtract(Duration(days: duration.days)); + newDateTime = _addMonths(newDateTime, -duration.months); + newDateTime = _addMonths(newDateTime, -duration.years * 12); + return newDateTime; } static DateDuration age(DateTime birthdate, {DateTime? today}) { @@ -117,4 +125,16 @@ class AgeCalculator { : tempDate; return dateDifference(fromDate: endDate, toDate: nextBirthdayDate); } + + static DateTime _addMonths(DateTime dateTime, int months) { + final modMonths = months % 12; + var newYear = dateTime.year + ((months - modMonths) ~/ 12); + var newMonth = dateTime.month + modMonths; + if (newMonth > 12) { + newYear++; + newMonth -= 12; + } + final newDay = min(dateTime.day, daysInMonth(newYear, newMonth)); + return DateTime(newYear, newMonth, newDay); + } }