flutter 仅比较Dart中DateTimes的日期

b09cbbtk  于 2023-04-13  发布在  Flutter
关注(0)|答案(7)|浏览(162)

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

  1. (date1.year == date2.year && date1.month == date2.month && date1.day == date2.day)
    这就是我现在正在做的,但它非常冗长。
  2. date1.format("YYYYMMDD") == date2.format("YYYYMMDD")
    这仍然是相当冗长的(虽然不是那么糟糕),但似乎只是效率低下我...
    1.我自己创建一个新的Date类,也许将日期存储为“YYYYMMDD”字符串,或者自1980年1月1日以来的天数。但这意味着重新实现一大堆复杂的逻辑,比如不同的月长,加/减和闰年。
    创建一个新的类也避免了我担心的边缘情况,即添加Duration(days: 1)由于夏令时的变化而导致相同的日期。
    哪一个是最好的解决方案,或者有一个更好的解决方案,我还没有想到?
6ie5vjzr

6ie5vjzr1#

既然我问了这个问题,extension methods已经在Dart中发布了。我现在将选项1实现为扩展方法:

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

x4shl7ld2#

可以使用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');
  }
oewdyzsn

oewdyzsn3#

最简单的选择是使用DateUtils
举个例子

if (DateUtils.isSameDay(date1, date2){
   print('same day')
}

isSameDay接受2个DateTime对象并忽略time元素

mefy6pfw

mefy6pfw4#

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转换为天数,即可简单地比较天数

ippsafx7

ippsafx75#

我用这个函数来计算天数的差异。
比较日期很棘手,因为结果不仅取决于时间戳,还取决于用户的时区。

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

8yparm6h6#

使用以下包: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);
gg0vcinb

gg0vcinb7#

使用isAtSameMomentAs

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

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

相关问题