Alays
Alays

Reputation: 140

Adding days to a date doesn't work properly

I am trying to add days to a date but I don't understand the result, here is my code :

void testDate(){
  DateTime start = DateTime(2019,10,1);
  DateTime end = DateTime(2019,11,1);

  List<DateTime> list = new List();
  DateTime current = DateTime.fromMillisecondsSinceEpoch(start.millisecondsSinceEpoch);

  while(current.isBefore(end)){
    list.add(DateTime.fromMillisecondsSinceEpoch(current.millisecondsSinceEpoch));
    Duration duration = Duration(days:3);
    current = current.add(duration);
    print(current);
    current = DateTime(current.year,current.month,current.day);
  }
}

I got this result :

2019-10-04 00:00:00.000
2019-10-07 00:00:00.000
2019-10-10 00:00:00.000
2019-10-13 00:00:00.000
2019-10-16 00:00:00.000
2019-10-19 00:00:00.000
2019-10-22 00:00:00.000
2019-10-25 00:00:00.000
2019-10-27 23:00:00.000
2019-10-29 23:00:00.000
2019-11-01 00:00:00.000

Why 2019-10-25 00:00:00.000 + 3 days = 2019-10-27 23:00:00.000 ? it should be 2019-10-28 00:00:00.000

Upvotes: 1

Views: 837

Answers (2)

Mahdi Dahouei
Mahdi Dahouei

Reputation: 1941

You should use DateTime constructor to add days. it has this feature that if you provide a value that exceeds the current time context such as a 32nd day of the month, it automatically switches to the first day of the next month.

  const daysToAdd = 3;

  current = DateTime(
    current.year,
    current.month,
    current.day + daysToAdd,
  );

you can also subtract days:

  current = DateTime(
    current.year,
    current.month,
    current.day - 150,
  );

checkout this article: https://www.flutterclutter.dev/flutter/troubleshooting/datetime-add-and-subtract-daylight-saving-time/2021/2317/

Upvotes: 4

Fernando Rocha
Fernando Rocha

Reputation: 2599

The Documentation states that:

"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."

Probably there's a daylight saving starting between

2019-10-25 00:00:00.000

2019-10-27 23:00:00.000

check it out at:

https://api.flutter.dev/flutter/dart-core/DateTime/add.html

Upvotes: 1

Related Questions