在 Flutter 中仅按日期比较 DateTime 对象

Comparing DateTime Objects by Date Only in Flutter

提问人:Munsif Ali 提问时间:11/10/2023 更新时间:11/19/2023 访问量:56

问:

我正在处理一个 Flutter 项目,我需要比较两个 DateTime 对象,但只能按它们的日期进行比较。DateTime 对象的时间部分与我的比较无关。

下面是我正在处理的 DateTime 对象的示例:

飞镖

DateTime dt1 = DateTime.parse("2023-11-10 11:47:00");
DateTime dt2 = DateTime.parse("2023-11-10 10:09:00");

我想比较 dt1 和 dt2,以便只考虑日期(年、月、日),而不考虑时间。如何在 Flutter 中实现这一点?任何帮助将不胜感激。谢谢!

Flutter Dart 日期时间 比较

评论

0赞 Randal Schwartz 11/10/2023
小心未正确考虑时区的解决方案。如果您比较的日期接近午夜,更改时区可能会使它们在同一天或不同日期。所以这个问题只对某些时区有意义。

答:

0赞 Munsif Ali 11/10/2023 #1

在 Flutter 中,你可以通过从仅包含年、月和日信息的原始对象创建新对象来比较两个对象,仅相对于日期(而不是时间)。下面是一个示例:DateTimeDateTime

DateTime dt1 = DateTime.parse("2023-11-10 11:47:00");
DateTime dt2 = DateTime.parse("2023-11-10 10:09:00");

// Create new DateTime objects with only year, month, and day
DateTime date1 = DateTime(dt1.year, dt1.month, dt1.day);
DateTime date2 = DateTime(dt2.year, dt2.month, dt2.day);

// Now you can compare date1 and date2
if(date1.compareTo(date2) == 0){
  print("Both dates are the same.");
} 
if(date1.compareTo(date2) < 0){
  print("date1 is before date2");
} 
if(date1.compareTo(date2) > 0){
  print("date1 is after date2");
}

在此代码中,和分别是从 和 创建的新对象,但它们仅包含年、月和日信息。默认情况下,时间设置为 00:00:00。因此,当您比较 和 时,您实际上只比较日期,而不是时间。date1date2DateTimedt1dt2date1date2

评论

1赞 Zhentao 11/10/2023
您可以直接比较 dt1 和 dt2 的年、月、日,为什么要创建新的 DateTime 对象?
0赞 jamesdlin 11/10/2023
@Zhentao 如果你正在测试相等性,那么如果没有新对象,比较是微不足道的。然而,三向比较棘手,而且很容易做错。创建新对象更简单,更不容易出错。DateTimeDateTime
2赞 Aymen Denoub 11/19/2023 #2

1) 仅使用年、月和日属性创建新的 Date 对象

final date1 = DateTime.parse('2021-09-01 03:30:00');
final date2 = DateTime.parse('2021-09-01 04:30:00');

int compareOnlyByDate(DateTime other) {
  return DateTime(date1.year, date1.month, date1.day).compareTo(
    DateTime(other.year, other.month, other.day),
  );
}

// usage
final result = date1.compareOnlyByDate(date2);

if (result == 0) {
  print('dates are equal');
} 
if (result < 0) {
  print('date1 is before date2');
}
if (result > 0) {
  print('date1 is after date2');
}

或者作为扩展方法:

extension CompareDates on DateTime {
  int compareOnlyByDate(DateTime other) {
    return DateTime(year, month, day).compareTo(
      DateTime(other.year, other.month, other.day),
    );
  }
}

2) 如果您不想创建新对象

您可以比较对象的 、 和 属性:yearmonthdayDateTime

int compareOnlyByDate(DateTime date1, DateTime date2) {
  if (date1.year == date2.year) {
    if (date1.month == date2.month) {
      return date1.day - date2.day;
    } else {
      return date1.month - date2.month;
    }
  } else {
    return date1.year - date2.year;
  }
}

这是另一种方法:

bool isSameDay(DateTime date1, DateTime date2) {
  return date1.year == date2.year &&
      date1.month == date2.month &&
      date1.day == date2.day;
}

bool isGreater(DateTime date1, DateTime date2) {
  return date1.isAfter(date2) && !isSameDay(date1, date2);
}

bool isLess(DateTime date1, DateTime date2) {
  return date1.isBefore(date2) && !isSameDay(date1, date2);
}

评论

0赞 Munsif Ali 11/19/2023
很好的解释。