检查日期时间变量是今天、明天还是昨天

Gia*_*o M 33 datetime dart

我不知道如何检查日期时间变量是今天、明天还是昨天。

我在类成员中没有找到方法。

Gün*_*uer 63

final now = DateTime.now();
final today = DateTime(now.year, now.month, now.day);
final yesterday = DateTime(now.year, now.month, now.day - 1);
final tomorrow = DateTime(now.year, now.month, now.day + 1);


final dateToCheck = ...
final aDate = DateTime(dateToCheck.year, dateToCheck.month, dateToCheck.day);
if(aDate == today) {
  ...
} else if(aDate == yesterday) {
  ...
} else(aDate == tomorrow) {
  ...
}
Run Code Online (Sandbox Code Playgroud)

命中:now.day - 1并且now.day + 1适用于导致不同年份或月份的日期。

  • 非常感谢“提示:now.day - 1 和 now.day + 1 可以很好地处理导致不同年份或月份的日期。” (4认同)

Sky*_*ost 25

虽然上述答案是正确的,但我想提供一个更紧凑和灵活的替代方案:

/// Returns the difference (in full days) between the provided date and today.
int calculateDifference(DateTime date) {
  DateTime now = DateTime.now();
  return DateTime(date.year, date.month, date.day).difference(DateTime(now.year, now.month, now.day)).inDays;
}
Run Code Online (Sandbox Code Playgroud)

所以如果你想检查是否date是:

  • 昨天calculateDifference(date) == -1
  • 今天calculateDifference(date) == 0
  • 明天calculateDifference(date) == 1

  • 这有一个缺陷。如果“您正在检查的日期”和“今天的日期”相差不到 24 小时,它会告诉您相差 0 天,这是正确的,但会产生误导。日期不同,但间隔时间不超过一天 (7认同)
  • 通过创建仅包含年、月和日的新日期时间,我们不考虑小时。 (6认同)

34m*_*4m0 18

使用 dart 扩展可以让你的代码更优雅。您可以使用以下内容创建实用程序类:

extension DateHelpers on DateTime {
  bool isToday() {
    final now = DateTime.now();
    return now.day == this.day &&
        now.month == this.month &&
        now.year == this.year;
  }

  bool isYesterday() {
    final yesterday = DateTime.now().subtract(Duration(days: 1));
    return yesterday.day == this.day &&
        yesterday.month == this.month &&
        yesterday.year == this.year;
  }
}
Run Code Online (Sandbox Code Playgroud)

然后每当您需要知道某一天是今天还是昨天时,将实用程序类导入到您需要的文件中,然后调用适当的函数,就像类中内置的那样DateTime

Text(
    myDate.isToday() ? "Today" 
  : myDate.isYesterday() ? "Yesterday" 
  : DateFormat("dd MMM").format(myDate)
)
Run Code Online (Sandbox Code Playgroud)


Ced*_*Ced 17

@34mo 的答案已更新为 flutter lint 2021

extension DateUtils on DateTime {
  bool get isToday {
    final now = DateTime.now();
    return now.day == day && now.month == month && now.year == year;
  }

  bool get isTomorrow {
    final tomorrow = DateTime.now().add(const Duration(days: 1));
    return tomorrow.day == day &&
        tomorrow.month == month &&
        tomorrow.year == year;
  }

  bool get isYesterday {
    final yesterday = DateTime.now().subtract(const Duration(days: 1));
    return yesterday.day == day &&
        yesterday.month == month &&
        yesterday.year == year;
  }
}
Run Code Online (Sandbox Code Playgroud)


And*_*eev 11

一个简单的isToday检查:

/// Returns `true` if the [date] is today. Respects the time zone.
/// https://stackoverflow.com/a/60213219/1321917
bool isToday(DateTime date) {
  final DateTime localDate = date.toLocal();
  final now = DateTime.now();
  final diff = now.difference(localDate).inDays;
  return diff == 0 && now.day == localDate.day;
}
Run Code Online (Sandbox Code Playgroud)