Flutter:找出两个日期之间的差异

时间:2018-10-09 03:52:03

标签: dart flutter

我目前有一个用户的个人资料页面,其中显示了他们的出生日期和其他详细信息。但是我打算通过计算今天的日期和从用户那里获得的出生日期之间的差来找到他们生日前的日子。

用户的出生日期

User DOB

这是使用intl package获得的今天的日期。

今天的日期

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

我现在面临的问题是,如何计算这两个日期的天数差异?

有没有特定的配方或包装可供我结帐?

12 个答案:

答案 0 :(得分:13)

您可以使用difference类提供的DateTime方法

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

答案 1 :(得分:4)

当心选择答案的未来“错误”

所选答案中真正缺少的东西 - 奇怪地大量支持 - 是它会计算两个日期之间的差异

<块引用>

持续时间

这意味着如果差异小于 24 小时,则两个日期将被视为相同!!通常这不是想要的行为。您可以通过稍微调整代码来解决此问题,以便截断时钟:

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; 
}

因此您可以检测 from 是否在 to 之前,因为它将返回一个表示天数差异的正整数,否则返回负数,如果两者都发生在同一天,则返回 0。

documentation 中指明了此函数返回的内容,并且在许多用例中,如果遵循原始选择的答案,它可能会导致一些可能难以调试的问题:

<块引用>

从这个 (to) 中减去其他 (from) 时,返回一个 Duration 的差值。

希望有帮助。

答案 2 :(得分:3)

您可以使用Datetime类来查找两年之间的时差,而无需使用intl格式化日期。

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');

答案 3 :(得分:2)

如果有人想找出秒、分、小时和天的不同形式。那么这是我的方法。

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';
  }

答案 4 :(得分:1)

两个日期之间的区别

要找出两个DateTime对象之间有多少时间,请使用difference,它返回一个Duration对象:

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

print(different); // 19362

差异以秒为单位,以秒为单位。上面的差异计算的是这些日期开始时午夜之间的小数秒数。如果上述日期是当地时间而不是UTC,则由于夏令时的差异,两个午夜之间的时差可能不是24小时的倍数。

如果在此之后发生其他情况,则返回的持续时间将为负。

答案 5 :(得分:1)

接受的答案是错误的。不要使用它。

这是正确的:

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();
}

测试:

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!

解释为什么接受的答案是错误的:

只需运行这个:

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);

注意:由于夏令时,即使您标准化为 0:00,您的某一天和第二天之间也可能有 23 小时的差异。这就是为什么以下内容也不正确:

// 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:如果你问我,Dart DateTime 非常糟糕。它至少应该有基本的东西,比如 daysBetween 以及时区处理等。

答案 6 :(得分:0)

使用DateTime类找出两个日期之间的时差。

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

答案 7 :(得分:0)

另一个可能更直观的选择是使用“基本”软件包:

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

有关该软件包的更多信息:https://pub.dev/packages/basics

答案 8 :(得分:0)

所有这些答案都忽略了一个关键部分,那就是闰年。

这是计算年龄的完美解决方案:

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;
}

答案 9 :(得分:0)

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); ```

答案 10 :(得分:-1)

void initState() {
    // TODO: implement initState
    super.initState();
    final date1 = DateTime(2019,2,21);
    final date2 = DateTime(2019,3,7);
    final difference = date2.difference(date1).inDays/7+1;
    final difference2 = date2.difference(date1).inDays;
    final difference3 = date2.difference(date1).inDays/7;
    print(difference3.toString());
    print(difference2.toString());
   print("abc     :"+difference.toString());

  }

答案 11 :(得分:-1)

日期时间的扩展

使用 extension 类,您可以:

int days = birthdate.daysSince;

示例 extension 类:

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