Дротик / флаттер Как сравнить два времени TimeOfDay?

В документации TimeOfDay нет оператора сравнения, а примитивное сравнение не работает. Мое единственное решение, о котором я могу думать прямо сейчас, - это преобразовать TimeOfDay в DateTime и использовать метод разности DateTime.

У кого-нибудь есть лучшее решение?

12 ответов

Преобразуйте его в двойное, затем сравните.

double toDouble(TimeOfDay myTime) => myTime.hour + myTime.minute/60.0

      extension TimeOfDayExtension on TimeOfDay {
  int compareTo(TimeOfDay other) {
    if (this.hour < other.hour) return -1;
    if (this.hour > other.hour) return 1;
    if (this.minute < other.minute) return -1;
    if (this.minute > other.minute) return 1;
    return 0;
  }
}

Благодаря идее @Lucas, вы можете рассчитать час и минуту по

TimeOfDay yourTime ; 
TimOfDay nowTime = TimeOfDay.now()

double _doubleyourTime = yourTime.hour.toDouble() +
            (yourTime.minute.toDouble() / 60);
double _doubleNowTime = nowTime.hour.toDouble() +
            (nowTime.minute.toDouble() / 60);

double _timeDiff = _doubleOpenTime - _doubleNowTime;

double _hr = _timeDiff.truncate();
double _minute = (_timeDiff - _timeDiff.truncate()) * 60;

print('Here your Happy $_hr Hour and _minute min');

Я вычислил разницу, превратив оба значения в количество минут и сравнив их:)

TimeOfDay now = TimeOfDay.now();
int nowInMinutes = now.hour * 60 + now.minute;

TimeOfDay testDate = TimeOfDay(hour: 2, minute: 20);
int testDateInMinutes = testDate.hour * 60 + testDate.minute;

Вы можете использовать этот метод. Где вы должны указать время начала и время окончания в формате TimesofDay.

      getTime(startTime, endTime) {
  bool result = false;
  int startTimeInt = (startTime.hour * 60 + startTime.minute) * 60;
  int EndTimeInt = (endTime.hour * 60 + endTime.minute) * 60;
  int dif = EndTimeInt - startTimeInt;

  if (EndTimeInt > startTimeInt) {
    result = true;
  } else {
    result = false;
  }
  return result;
}

Как это

      getTime(v1, v2);

Решение для расчета отрицательной длительности

Все эти ответы довольно хороши, но они не помогли мне, когда пользователь несколько раз выбирал в моем приложении. Чтобы рассчитать общую продолжительность указанного периода времени, я попробовал все решения, которые работают довольно хорошо, но терпят неудачу в определенных сценариях. Сценарии:

  1. Когда время начала наступает после времени окончания (т. е. когда предполагается, что продолжительность превышает 12 часов)
  2. Когда время начала до 12 часов ночи, а время окончания после этого

И код для его преодоления:

      String durationFromTimeOfDay(TimeOfDay? start, TimeOfDay? end) {
    if (start == null || end == null) return '';

    // DateTime(year, month, day, hour, minute)
    final startDT = DateTime(9, 9, 9, start.hour, start.minute);
    final endDT = DateTime(9, 9, 10, end.hour, end.minute);

    final range = DateTimeRange(start: startDT, end: endDT);
    final hours = range.duration.inHours % 24;
    final minutes = range.duration.inMinutes % 60;

    final _onlyHours = minutes == 0;
    final _onlyMinutes = hours == 0;
    final hourText = _onlyMinutes
        ? ''
        : '$hours${_onlyHours ? hours > 1 ? ' hours' : ' hour' : 'h'}';
    final minutesText = _onlyHours
        ? ''
        : '$minutes${_onlyMinutes ? minutes > 1 ? ' mins' : ' min' : 'm'}';
    return hourText + minutesText;
  }

Важно отметить, что вам необходимо предварительно заполнить for end TimeOfDayсо значением дня, которое больше, чем то же самое в началеDateTime. Остальные параметры (год и месяц) могут быть любыми.

Это выводит действительно красиво отформатированную строку, короткую, лаконичную и чрезвычайно разборчивую.

Это, однако, не удовлетворяет требованию, что решение лишено преобразования в DateTime. Но, по крайней мере, он использует другой подход по сравнению сdifferenceметод. И это делает правильный расчет длительности более надежным в сравнении с несколькими строками кода.

      TimeOfDay n = TimeOfDay.now();
int nowSec = (n.hour * 60 + n.minute) * 60;
int veiSec = (t.hour * 60 + t.minute) * 60;
int dif = veiSec - nowSec;

На самом деле мы можем использовать оператор вычитания.

Код для волшебства:

Здесь я хотел получить разницу во времени после того, как пользователь выберет время (в формате TimeOfDay) с помощью showTimePicker()

      // current time will be used to find the difference between the time selected by the user.
TimeOfDay _cur_time = TimeOfDay(hour: DateTime.now().hour, minute: DateTime.now().minute);

// scheduled time will be updated as soon as the user inputs a new time using the showTimePicker() function available in Flutter Material librabry.
TimeOfDay _scheduled_time = TimeOfDay(hour: DateTime.now().hour, minute: DateTime.now().minute);

// toDouble Function to convert time to double so that we can compare time and check that the time selected is greater than current time.
      double toDouble(TimeOfDay myTime) => myTime.hour + myTime.minute / 60.0;

  void _selectTime() async {
Flutter Material widget to select time.
final TimeOfDay? newTime = await showTimePicker(
  context: context,
  initialTime: _scheduled_time,
);
//Check if the selected time is greater than the cur time
if (toDouble(newTime!) > toDouble(_cur_time)) {
  setState(() {
    _scheduled_time = newTime;
  });
}
  }
Function to get the difference between cur time and selected time.
      Duration _getDelayedDuration(){
        var hourDelay = _scheduled_time.hour - _cur_time.hour;
        print(hourDelay);
        var minuteDelay = _scheduled_time.minute - _cur_time.minute;
        print(minuteDelay);
        return Duration(hours: hourDelay, minutes: minuteDelay);
      }
Card(
    child: ListTile(
      onTap: () {
        showTimePicker(
          context: context,
          initialTime: TimeOfDay.now(),
        ).then((TimeOfDay time) {
          double _doubleyourTime =
              time.hour.toDouble() + (time.minute.toDouble() /60);
          double _doubleNowTime = TimeOfDay.now().hour.toDouble() +
              (TimeOfDay.now().minute.toDouble() / 60);`enter code here`
          if (_doubleyourTime > _doubleNowTime) {
           print('correct format')
            });
          } else {
           print('Sorry You can not set the time')
         
          }
        });
      },
      //dense: true,
      leading: Icon(Icons.timer),
      title: Text(
        'Today On Time',`enter code here`
      ),
    ),
  ),

Вы не можете сравнивать 2 TimeOfDayпеременные, потому что у вас недостаточно информации. Дарт не знает, какой день, месяц и год вы хотите сравнить. Как вы упомянули, единственный способ конвертироватьTimeOfDay к DateTime.

В противном случае вы всегда можете преобразовать TimeOfDay как предлагается в других ответах на double и посчитайте разницу.

Я рассчитал текущее время между двумя временами:

DateTime before;
DateTime later;
before = DateTime.now();
later = DateTime.now();
print(before.difference(later));

И вы можете рассчитать до миллисекунд:

print(before.difference(Later).inMilliseconds);

Я не думаю, что это возможно. Ты можешь использовать .subtract в DateTime, а также .difference

Другие вопросы по тегам