我的应用程序会匹配具有特定爱好的用户。为此,用户通常需要商定定期会议时间。例如“每周五下午 6 点至晚上 10 点”。
存储方面,我想我会采用如下所述的简单方法:如何存储时间值,特别是 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
吗?但持续时间将无法正常工作。
使用 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': ${end.display()}");