仅比较Dart中的DateTimes日期

Luc*_*cas 6 time date 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日以来的天数。但这意味着重新实现一堆复杂的逻辑,例如不同的月长,加/减和/年。

创建新类也避免了我担心的极端情况,Duration(days: 1)由于夏令时的更改,添加结果的日期相同。但是我可能没有想到这种方法的一些极端情况...

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

Luc*_*cas 51

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

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

  • 请注意,实际上日期很可能以天为单位,然后以月为单位,然后以年为单位。所以从白天开始应该更快。 (8认同)
  • 在扩展函数中,您可以删除它以访问其成员。功能可以。bool isSameDate(DateTime other) { return 年 == other.year && 月 == other.month && day == other.day; } (2认同)

And*_*rew 31

The easiest option is just to use DateUtils

For example

if (DateUtils.isSameDay(date1, date2)){
   print('same day')
}
Run Code Online (Sandbox Code Playgroud)

isSameDay takes in 2 DateTime objects and ignores the time element, and that function exists in flutter/material.dart

  • 这应该是正确的答案 (2认同)

小智 11

您可以使用差异

int diffDays = date1.difference(date2).inDays;
bool isSame = (diffDays == 0);
Run Code Online (Sandbox Code Playgroud)

  • 这不是一个好答案。如果date1和date2相隔不到24小时,则即使它们不是在达世之日也相差0。 (13认同)

yas*_*173 10

您可以使用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');
  }
Run Code Online (Sandbox Code Playgroud)


小智 9

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

dateTime.difference(_pickedDate).inDays == 0 // <- this results to true or false
Run Code Online (Sandbox Code Playgroud)

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

  • 这是不正确的。两个日期可能相差不到一天,但仍然是不同的两天(例如 date1 = 27/04/2021 23:00 - date2 = 28/04/2021 01:00) (3认同)

小智 5

使用包:dart_date Dart Extensions for DartTime

dart_date 提供了最全面、最简单且一致的工具集来操作 Dart 日期。

dart_日期

DateTime now = DateTime.now();
DateTime date = ....;
if (date.isSameDay(now)) {
  //....
} else {
  //....
}
Run Code Online (Sandbox Code Playgroud)

这里还有天数的差异:

int differenceInDays(DateTime a, DateTime b) => a.differenceInDays(b);
Run Code Online (Sandbox Code Playgroud)

  • @Komeyl94正如在类似答案的评论中提到的,`a.difference(b).inDays`是不正确的,并且当日期时间间隔小于24小时时将会失败(例如date1 = 27/04/2021 23:00 - date2 = 28 /04/2021 01:00)。 (2认同)