首页 > 解决方案 > Dart : 显示直到下一次的时间

问题描述

如何显示倒计时持续时间直到下一个警报

代码:

TimeOfDay _nextSalah(List<SalahModel> salahs) {
    DateTime now = DateTime.now();
    List<TimeOfDay> times = [];
    int currentSalah;

    salahs.forEach((s) => times.add(s.time));
    times.add(TimeOfDay(hour: now.hour, minute: now.minute));
    times.sort((a, b) => a.hour.compareTo(b.hour));
    currentSalah = times.indexWhere((time) => time.hour == now.hour);

    return TimeOfDay(hour: times[currentSalah].hour, minute: times[currentSalah].minute);
}

但是时差是错误的,它没有动画。另外,如何确保时差在同一天和第二天的时间起作用,即现在是 12 月 1 日下午 2:30,我想在 12 月 2 日上午 6:15 获得时差。

标签: dartcountdowntimer

解决方案


它不起作用,因为TimeOfDay代表一天中的某个时间,与当天可能落在的日期或时区无关。时间仅用小时和分钟表示。

如果您想要跨多天的倒计时,DateTime则必须使用时差评估,然后在格式化结果字符串之前进行一些数学运算,例如:

String nextTime(DateTime nextAlarmTime) {
  List<int> ctime = [0, 0, 0, 0];
  DateTime now = DateTime.now();
  int diff = nextAlarmTime.difference(now).inSeconds;
  ctime[0] = diff ~/ (24 * 60 * 60); // days
  diff -= ctime[0] * 24 * 60 * 60;

  ctime[1] = diff ~/ (60 * 60); // hours
  diff -= ctime[1] * 60 * 60;

  ctime[2] = diff ~/ 60; // minutes
  ctime[3] = diff - ctime[2] * 60;  // seconds

  return ctime.map((val) => val.toString().padLeft(2, '0')).join(':');
}

推荐阅读