Мое приложение подбирает пользователей по определенному хобби. Для этого пользователям обычно необходимо договориться об обычном времени встречи. Например, «каждую пятницу с 18:00 до 22:00».
С точки зрения хранения я думаю, что воспользуюсь простым подходом, описанным здесь: Как я могу хранить значение времени, а именно только часы и минуты, в Firebase?
"monday":
{
"start":
{
"hour": 7,
"minute": 30
},
"duration":
{
"hour": 13,
"minute": 30
}
}
Но теперь вопрос в том, как мне эффективно использовать их в Dart/Flutter, чтобы показывать время «от до», без необходимости в основном реконструировать базовый расчет времени следующим образом:
var times = {
// Weekday: [startHour, startMin, durationHour, durationMin]
"Mo": [18, 00, 3, 30],
"Tu": [18, 30, 4, 00],
};
var monday = times["Mo"];
Text("User's schedule: 'Mo': ${monday![0]}:${monday[1]} - ${calculateEndHour()}");
Это кажется излишне утомительным.
Должен ли я просто построить их все как DateTime
с одной и той же фиксированной датой? Но тогда продолжительность не будет работать должным образом.
«Это кажется излишне утомительным». Тогда напишите функцию, которая поможет вам?
@jamesdlin Вот что я в итоге сделал :) Просто подумал, может быть, я упускаю что-то, что облегчит жизнь.
Я фанат часовых поясов, поэтому, когда я вижу «с 18:00 до 22:00», я сразу задаюсь вопросом: «Да, но чья версия 18:00??». Как вы справляетесь с часовыми поясами?
@RandalSchwartz Я буду использовать UTC и явно отображать timeZoneOffset
, потому что это большая часть этого приложения, позволяющая пользователям подключаться по всему миру. В общем, как описано здесь.
Используя классы, доступные в Dart/Flutter, я бы действовал следующим образом (действительно, это утомительно, по крайней мере, писать в первый раз, но, по крайней мере, он не использует некоторые 1970-01-01
DateTime): вы можете использовать TimeOfDay
класс для хранения (час, минута) в том же объекте, я думаю, это было бы хорошим началом (в этом классе нет никакого метода расчета, но именно для этого и был создан extension
). Также имело бы смысл хранить «длительность» в классе Duration
. Делать это:
Учитывая методы расширения:
extension TimeOfDayExtensions on TimeOfDay {
TimeOfDay addDuration(Duration duration) {
int totalInMinutes = minute + duration.inMinutes;
int finalMinutes = totalInMinutes % 60;
int hoursToAdd = (totalInMinutes - finalMinutes) ~/ 60;
int finalHours = (hour + hoursToAdd) % 24;
return TimeOfDay(hour: finalHours, minute: finalMinutes);
}
String display() {
return "${hour < 10 ? "0" : ""}${hour.toString()}:${minute < 10 ? "0" : ""}${minute.toString()}";
}
}
Вы можете легко вызвать его с помощью:
TimeOfDay begin = TimeOfDay(hour: 18, minute: 00);
Duration duration = Duration(hours: 3, minutes: 30);
TimeOfDay end = begin.addDuration(duration);
Text("User's schedule: 'Mo': ${begin.display()} - ${end.display()}");
Это намного сложнее, чем то, что я придумал, спасибо!
@Big_Chair Пожалуйста, мне было весело его создавать. Обратите внимание, что вы можете легко улучшить его, чтобы использовать формат 12 часов утра/после полудня, если хотите.
Вы можете попробовать: pub.dev/packages/rrule