81
votes

I currently have a user's profile page that brings out their date of birth and other details. But I am planning to find the days before their birthday by calculating the difference between today's date and the date of birth obtained from the user.

User's Date of Birth

User DOB

And this is today's date obtained by using the intl package.

Today's date

I/flutter ( 5557): 09-10-2018

The problem I am facing now is, How do I calculate the difference in days of these two dates?

Are there any specific formulas or packages that are available for me to check out?

11

11 Answers

233
votes

You can use the difference method provide by DateTime class

 //the birthday's date
 final birthday = DateTime(1967, 10, 12);
 final date2 = DateTime.now();
 final difference = date2.difference(birthday).inDays;

UPDATE

Since many of you reported there is a bug with this solution and to avoid more mistakes, I'll add here the correct solution made by @MarcG, all the credits to him.

  int daysBetween(DateTime from, DateTime to) {
     from = DateTime(from.year, from.month, from.day);
     to = DateTime(to.year, to.month, to.day);
   return (to.difference(from).inHours / 24).round();
  }

   //the birthday's date
   final birthday = DateTime(1967, 10, 12);
   final date2 = DateTime.now();
   final difference = daysBetween(birthday, date2);

This is the original answer with full explanation: https://stackoverflow.com/a/67679455/666221

9
votes

Use DateTime class to find out the difference between two dates.

DateTime dateTimeCreatedAt = DateTime.parse('2019-9-11'); 
DateTime dateTimeNow = DateTime.now();
final differenceInDays = dateTimeNow.difference(dateTimeCreatedAt).inDays;
print('$differenceInDays');

or

You can use jiffy. Jiffy is a date dart package inspired by momentjs for parsing, manipulating and formatting dates.

Example: 1. Relative Time

Jiffy("2011-10-31", "yyyy-MM-dd").fromNow(); // 8 years ago
Jiffy("2012-06-20").fromNow(); // 7 years ago

var jiffy1 = Jiffy()
    ..startOf(Units.DAY);
jiffy1.fromNow(); // 19 hours ago

var jiffy2 = Jiffy()
    ..endOf(Units.DAY);
jiffy2.fromNow(); // in 5 hours

var jiffy3 = Jiffy()
    ..startOf(Units.HOUR);
jiffy3.fromNow(); 

2. Date Manipulation:

var jiffy1 = Jiffy()
      ..add(duration: Duration(days: 1));
jiffy1.yMMMMd; // October 20, 2019

var jiffy2 = Jiffy()
    ..subtract(days: 1);
jiffy2.yMMMMd; // October 18, 2019

//  You can chain methods by using Dart method cascading
var jiffy3 = Jiffy()
     ..add(hours: 3, days: 1)
     ..subtract(minutes: 30, months: 1);
jiffy3.yMMMMEEEEdjm; // Friday, September 20, 2019 9:50 PM

var jiffy4 = Jiffy()
    ..add(duration: Duration(days: 1, hours: 3))
    ..subtract(duration: Duration(minutes: 30));
jiffy4.format("dd/MM/yyy"); // 20/10/2019


// Months and year are added in respect to how many 
// days there are in a months and if is a year is a leap year
Jiffy("2010/1/31", "yyyy-MM-dd"); // This is January 31
Jiffy([2010, 1, 31]).add(months: 1); // This is February 28
7
votes

You can Use the Datetime class to find the difference between the two years without using intl to format the date.

DateTime dob = DateTime.parse('1967-10-12');
Duration dur =  DateTime.now().difference(dob);
String differenceInYears = (dur.inDays/365).floor().toString();
return new Text(differenceInYears + ' years');
5
votes

The accepted answer is wrong. Don't use it.

This is correct:

int daysBetween(DateTime from, DateTime to) {
  from = DateTime(from.year, from.month, from.day);
  to = DateTime(to.year, to.month, to.day);
  return (to.difference(from).inHours / 24).round();
}

Testing:

DateTime date1 = DateTime.parse("2020-01-09 23:00:00.299871");
DateTime date2 = DateTime.parse("2020-01-10 00:00:00.299871");

expect(daysBetween(date1, date2), 1); // Works!

Explanation why the accepted answer is wrong:

Just run this:

int daysBetween_wrong1(DateTime date1, DateTime date2) {
  return date1.difference(date2).inDays;
}

DateTime date1 = DateTime.parse("2020-01-09 23:00:00.299871");
DateTime date2 = DateTime.parse("2020-01-10 00:00:00.299871");

// Should return 1, but returns 0.
expect(daysBetween_wrong1(date1, date2), 0);

Note: Because of daylight savings, you can have a 23 hours difference between some day and the next day, even if you normalize to 0:00. That's why the following is ALSO incorrect:

// Fails, for example, when date2 was moved 1 hour before because of daylight savings.
int daysBetween_wrong2(DateTime date1, DateTime date2) {
  from = DateTime(date1.year, date1.month, date1.day);  
  to = DateTime(date2.year, date2.month, date2.day);
  return date2.difference(date1).inDays; 
}

Rant: If you ask me, Dart DateTime is very bad. It should at least have basic stuff like daysBetween and also timezone treatment etc.


Update: The package https://pub.dev/packages/time_machine claims to be a port of Noda Time. If that's the case, and it's ported correctly (I haven't tested it yet) then that's the Date/Time package you should probably use.

4
votes

Beware of future "bugs" with selected answer

Something really missing in the selected answer - massively upvoted oddly - is that it will calculate the difference between two dates in term of:

Duration

It means that if there is less than 24h of differences both dates will be considered to be the same!! Often it is not the desired behavior. You can fix this by tweaking slightly the code in order to truncate from the day the clock:

Datetime from = DateTime(1987, 07, 11); // this one does not need to be converted, in this specific example, but we assume that the time was included in the datetime.
Datetime to = DateTime.now();

print(daysElapsedSince(from, to));

[...]

int daysElapsedSince(DateTime from, DateTime to) {
// get the difference in term of days, and not just a 24h difference
  from = DateTime(from.year, from.month, from.day);  
  to = DateTime(to.year, to.month, to.day);
 
  return to.difference(from).inDays; 
}

You can hence detect if from was before to, as it will return a positive integer representing the difference in term of number of days, else negative, and 0 if both happened on same day.

It is indicated in the documentation what this function return and in many usecases it can lead to some problem that may be difficult to debug if following the original selected answer:

Returns a Duration with the difference when subtracting other (from) from this (to).

Hope it helps.

3
votes

If anyone wants to find out the difference in form of seconds, minutes, hours, and days. Then here is my approach.

static String calculateTimeDifferenceBetween(
      {@required DateTime startDate, @required DateTime endDate}) {
    int seconds = endDate.difference(startDate).inSeconds;
    if (seconds < 60)
      return '$seconds second';
    else if (seconds >= 60 && seconds < 3600)
      return '${startDate.difference(endDate).inMinutes.abs()} minute';
    else if (seconds >= 3600 && seconds < 86400)
      return '${startDate.difference(endDate).inHours} hour';
    else
      return '${startDate.difference(endDate).inDays} day';
  }
1
votes

Get Different between two Dates

To find out how much time is between two DateTime objects use difference, which returns a Duration object:

final birthdayDate = DateTime(1967, 10, 12);
final toDayDate = DateTime.now();
var different = toDayDate.difference(birthdayDate).inDays;

print(different); // 19362

The difference is measured in seconds and fractions of seconds. The difference above counts the number of fractional seconds between midnight at the beginning of those dates. If the dates above had been in local time, not UTC, then the difference between two midnights may not be a multiple of 24 hours due to daylight saving differences.

The returned Duration will be negative if other occurs after this.

0
votes

All of these answers miss a crucial part and that is leap year.

Here is the perfect solution for calculating age:

calculateAge(DateTime birthDate) {
  DateTime currentDate = DateTime.now();
  int age = currentDate.year - birthDate.year;
  int month1 = currentDate.month;
  int month2 = birthDate.month;
  if (month2 > month1) {
    age--;
  } else if (month1 == month2) {
    int day1 = currentDate.day;
    int day2 = birthDate.day;
    if (day2 > day1) {
      age--;
    }
  }
  return age;
}
0
votes
var start_date = "${DateTime.now()}";
var fulldate =start_date.split(" ")[0].split("-");
var year1 = int.parse(fulldate[0]);
var mon1 = int.parse(fulldate[1]);
var day1 = int.parse(fulldate[2]);
var date1 = (DateTime(year1,mon1,day1).millisecondsSinceEpoch);
var date2 = DateTime(2021,05,2).millisecondsSinceEpoch;
var Difference_In_Time = date2 - date1;
var Difference_In_Days = Difference_In_Time / (1000 * 3600 * 24);
print(Difference_In_Days); ```
-1
votes

Another and maybe more intuitive option is to use Basics package:

 // the birthday's date
 final birthday = DateTime(1967, 10, 12);
 final today = DateTime.now();
 final difference = (today - birthday).inDays;

For more information about the package: https://pub.dev/packages/basics

-1
votes

Extension on DateTime

With an extension class you could:

int days = birthdate.daysSince;

Example extension class:

extension DateTimeExt on DateTime {
  int get daysSince => this.difference(DateTime.now()).inDays;
}