Add/Subtract months/years to date in dart?

FlutterDateDartSubtraction

Flutter Problem Overview


I saw that in dart there is a class Duration but it cant be used add/subtract years or month. How did you managed this issue, I need to subtract 6 months from an date. Is there something like moment.js for dart or something around? Thank you

Flutter Solutions


Solution 1 - Flutter

Okay so you can do that in two steps, taken from @zoechi (a big contributor to Flutter):

Define the base time, let us say:

var date = new DateTime(2018, 1, 13);

Now, you want the new date:

var newDate = new DateTime(date.year, date.month - 1, date.day);

And you will get

2017-12-13

Solution 2 - Flutter

You can use the subtract and add methods

 date1.subtract(Duration(days: 7, hours: 3, minutes: 43, seconds: 56)); 

 date1.add(Duration(days: 1, hours: 23)));

Flutter Docs:

Subtract

Add

Solution 3 - Flutter

Try out this package, Jiffy. Adds and subtracts date time with respect to how many days there are in a month and also leap years. It follows the simple syntax of momentjs

You can add and subtract using the following units

years, months, weeks, days, hours, minutes, seconds and milliseconds

To add 6 months

DateTime d = Jiffy().add(months: 6).dateTime; // 2020-04-26 10:05:57.469367
// You can also add you own Datetime object
DateTime d = Jiffy(DateTime(2018, 1, 13)).add(months: 6).dateTime; // 2018-07-13 00:00:00.000

You can also do chaining using dart method cascading

var jiffy = Jiffy().add(months: 5, years: 1);

DateTime d = jiffy.dateTime; // 2021-03-26 10:07:10.316874
// you can also format with ease
String s = jiffy.format("yyyy, MMM"); // 2021, Mar
// or default formats
String s = jiffy.yMMMMEEEEdjm; // Friday, March 26, 2021 10:08 AM

Solution 4 - Flutter

You can use subtract and add methods

Subtract

Add

But you have to reassign the result to the variable, which means:

This wouldn't work

 date1.add(Duration(days: 1, hours: 23)));

But this will:

 date1 = date1.add(Duration(days: 1, hours: 23)));

For example:

 void main() {
  var d = DateTime.utc(2020, 05, 27, 0, 0, 0);
  d.add(Duration(days: 1, hours: 23));
  // the prev line has no effect on the value of d
  print(d); // prints: 2020-05-27 00:00:00.000Z
  
  //But
  d = d.add(Duration(days: 1, hours: 23));
  print(d); // prints: 2020-05-28 23:00:00.000Z
}

Dartpad link

Solution 5 - Flutter

In simple way without using any lib you can add Month and Year

var date = new DateTime(2021, 1, 29);

Adding Month :-

 date = DateTime(date.year, date.month + 1, date.day);

Adding Year :-

 date = DateTime(date.year + 1, date.month, date.day);

Solution 6 - Flutter

Not so simple.

final date = DateTime(2017, 1, 1);
final today = date.add(const Duration(days: 1451));

This results in 2020-12-21 23:00:00.000 because Dart considers daylight to calculate dates (so my 1451 days is missing 1 hour, and this is VERY dangerous (for example: Brazil abolished daylight savings in 2019, but if the app was written before that, the result will be forever wrong, same goes if the daylight savings is reintroduced in the future)).

To ignore the dayligh calculations, do this:

final date = DateTime(2017, 1, 1);
final today = DateTime(date.year, date.month, date.day + 1451);

Yep. Day is 1451 and this is OK. The today variable now shows the correct date and time: 2020-12-12 00:00:00.000.

Solution 7 - Flutter

Use the add and subtract methods with a Duration object to create a new DateTime object based on another.

var date1 = DateTime.parse("1995-07-20 20:18:04");

var newDate = date1.add(Duration(days: 366));

print(newDate); // => 1996-07-20 20:18:04.000

Notice that the duration being added is actually 50 * 24 * 60 * 60 seconds. If the resulting DateTime has a different daylight saving offset than this, then the result won't have the same time-of-day as this, and may not even hit the calendar date 50 days later.

Be careful when working with dates in local time.

Solution 8 - Flutter

Increase and Decrease of the day/month/year can be done by DateTime class

Initialise DateFormat which needed to be shown

  var _inputFormat = DateFormat('EE, d MMM yyyy');
  var _selectedDate = DateTime.now();

Increase Day/month/year:

_selectedDate = DateTime(_selectedDate.year,
                        _selectedDate.month + 1, _selectedDate.day);

Increase Day/month/year:

  _selectedDate = DateTime(_selectedDate.year,
                            _selectedDate.month - 1, _selectedDate.day);

Above example is for only month, similar way we can increase or decrease year and day.

Solution 9 - Flutter

Can subtract any count of months.

  DateTime subtractMonths(int count) {
    var y = count ~/ 12;
    var m = count - y * 12;

    if (m > month) {
      y += 1;
      m = month - m;
    }

    return DateTime(year - y, month - m, day);
  }

Also works

DateTime(date.year, date.month + (-120), date.day);

Solution 10 - Flutter

It's pretty straightforward.

Simply add or subtract with numbers on DateTime parameters based on your requirements.

For example -

~ Here I had a requirement of getting the date-time exactly of 16 years before from today even with milliseconds and in below way I got my solution.

DateTime today = DateTime.now();
debugPrint("Today's date is: $today"); //Today's date is: 2022-03-17 09:08:33.891843

After desired subtraction;

  DateTime desiredDate = DateTime(
    today.year - 16,
    today.month,
    today.day,
    today.hour,
    today.minute,
    today.second,
    today.millisecond,
    today.microsecond,
  );
  debugPrint("18 years before date is: $desiredDate"); // 18 years before date is: 2006-03-17 09:08:33.891843

Solution 11 - Flutter

Future<void> main() async {
  final DateTime now = DateTime.now();
  var kdate = KDate.buildWith(now);
  log("YEAR", kdate.year);
  log("MONTH", kdate.month);
  log("DATE", kdate.date);
  log("Last Year", kdate.lastYear);
  log("Last Month", kdate.lastMonth);
  log("Yesturday", kdate.yesturday);
  log("Last Week Date", kdate.lastWeekDate);
}

void log(title, data) {
  print("\n$title  ====>  $data");
}

class KDate {
  KDate({
    this.now,
    required this.year,
    required this.month,
    required this.date,
    required this.lastYear,
    required this.lastMonth,
    required this.yesturday,
    required this.lastWeekDate,
  });
  final DateTime? now;
  final String? year;
  final String? month;
  final String? date;
  final String? lastMonth;
  final String? lastYear;
  final String? yesturday;
  final String? lastWeekDate;

  factory KDate.buildWith(DateTime now) => KDate(
        now: now,
        year: (now.year).toString().split(" ")[0],
        month: (now.month).toString().split(" ")[0],
        date: (now.day).toString().split(" ")[0],
        lastYear: (now.year - 1).toString().split(" ")[0],
        lastMonth: DateTime(now.year, now.month, now.month)
            .subtract(Duration(days: 28))
            .toString()
            .split(" ")[0]
            .toString()
            .split("-")[1],
        yesturday: DateTime(now.year, now.month, now.day)
            .subtract(Duration(days: 1))
            .toString()
            .split(" ")[0]
            .toString()
            .split("-")
            .last,
        lastWeekDate: DateTime(now.year, now.month, now.day)
            .subtract(Duration(days: 7))
            .toString()
            .split(" ")[0]
            .toString()
            .split("-")
            .last,
      );
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestioncosinusView Question on Stackoverflow
Solution 1 - FlutterSmilyView Answer on Stackoverflow
Solution 2 - FlutteraabiroView Answer on Stackoverflow
Solution 3 - FlutterJama MohamedView Answer on Stackoverflow
Solution 4 - Fluttera.haggiView Answer on Stackoverflow
Solution 5 - FlutterAnkit MahadikView Answer on Stackoverflow
Solution 6 - FlutterJCKödelView Answer on Stackoverflow
Solution 7 - FlutterParesh MangukiyaView Answer on Stackoverflow
Solution 8 - FlutterJitesh MohiteView Answer on Stackoverflow
Solution 9 - FlutterpolRkView Answer on Stackoverflow
Solution 10 - FlutterTechSatyaView Answer on Stackoverflow
Solution 11 - FlutterAnkur KumarView Answer on Stackoverflow