仅比较Dart中的DateTimes日期

时间:2018-10-24 21:32:09

标签: date time dart flutter

我需要在我的应用中存储和比较日期(无时间),而不必关心时区。
我可以看到三种解决方案:

  1. (date1.year == date2.year && date1.month == date2.month && date1.day == date2.day)
    这是我现在正在做的,但是太冗长了。

  2. date1.format("YYYYMMDD") == date2.format("YYYYMMDD")
    这仍然很冗长(尽管还不算太糟),但对我来说似乎效率不高...

  3. 自己创建一个新的Date类,也许将日期存储为“ YYYYMMDD”字符串,或者存储自1980年1月1日以来的天数。但这意味着重新实现一堆复杂的逻辑,例如不同的月份长度,加减法和leap年。

创建新类也避免了我担心的极端情况,由于夏时制的更改,添加Duration(days: 1)的日期最终会在相同的日期。但是使用这种方法可能存在一些边缘情况,而我却没有想到...

这些解决方案中最好的是哪个,还是我没有想到的更好的解决方案?

9 个答案:

答案 0 :(得分:21)

自从我问了这个问题以来,extension methods已在Dart中发布。我现在将选项1作为扩展方法实现:

extension DateOnlyCompare on DateTime {
  bool isSameDate(DateTime other) {
    return this.year == other.year && this.month == other.month
           && this.day == other.day;
  }
}

答案 1 :(得分:8)

DateTime dateTime= DateTime.now();
DateTime _pickedDate = // Some other DateTime instance

dateTime.difference(_pickedDate).inDays == 0 // <- this results to true or false

因为 DateTime 的 difference() 方法将结果返回为 Duration() 对象,所以我们只需使用 inDays 属性将 Duration 转换为天数就可以简单地比较天数

答案 2 :(得分:6)

您可以使用difference

int diffDays = date1.difference(date2).inDays;
bool isSame = (diffDays == 0);

答案 3 :(得分:2)

您可以使用compareTo

  var temp = DateTime.now().toUtc();
  var d1 = DateTime.utc(temp.year,temp.month,temp.day);
  var d2 = DateTime.utc(2018,10,25);     //you can add today's date here
  if(d2.compareTo(d1)==0){
    print('true');
  }else{
    print('false');
  }

答案 4 :(得分:2)

我正在使用此功能来计算天数差异。

比较日期非常棘手,因为结果不仅取决于时间戳,还取决于用户的时区。

int diffInDays (DateTime date1, DateTime date2) {
    return ((date1.difference(date2) - Duration(hours: date1.hour) + Duration(hours: date2.hour)).inHours / 24).round();
}

答案 5 :(得分:0)

我最终使用了this Dart package,这基本上是选项3。

答案 6 :(得分:0)

如果您想以一种简单的方式来计算差异,而不考虑时区或一天中的小时,而只考虑日历中的一天,那么这是一个解决方案

  DateTime date = DateTime.fromMicrosecondsSinceEpoch(1562022000);
  print(DateTime.now().day - date.day);

结果为2;

答案 7 :(得分:0)

使用以下软件包:dart_date DartTime的Dart扩展

dart_date提供了用于操纵Dart日期的最全面,最简单且一致的工具集。

dart_date

DateTime now = DateTime.now();
DateTime date = ....;
if (date.isSameDay(now)) {
  //....
} else {
  //....
}

这里也是天数的差异:

int differenceInDays(DateTime a, DateTime b) => a.differenceInDays(b);

答案 8 :(得分:0)

使用isAtSameMomentAs

var date1 = DateTime.now();
var date2 = date1.add(Duration(seconds: 1));

var isSame = date1.isAtSameMomentAs(date2); // false