Дротик / флаттер Как сравнить два времени 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);
Решение для расчета отрицательной длительности
Все эти ответы довольно хороши, но они не помогли мне, когда пользователь несколько раз выбирал в моем приложении. Чтобы рассчитать общую продолжительность указанного периода времени, я попробовал все решения, которые работают довольно хорошо, но терпят неудачу в определенных сценариях. Сценарии:
- Когда время начала наступает после времени окончания (т. е. когда предполагается, что продолжительность превышает 12 часов)
- Когда время начала до 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