我正试图在Flutter应用程序中构建一个周时间表。
我正在尝试生成一个给定时间范围内所有周的列表(例如2020年12月至2021年12月(。
每周都会有一个单独的列表,其中会包含日期。类似这样的东西:
[
[
{
dayName: 'Sunday',
date: 'December 13 2020',
},
{
dayName: 'Monday',
date: 'December 14 2020',
},
{
dayName: 'Tuesday',
date: 'December 15 2020',
},
{
dayName: 'Wednesday',
date: 'December 16 2020',
},
{
dayName: 'Thursday',
date: 'December 17 2020',
},
{
dayName: 'Friday',
date: 'December 18 2020',
},
{
dayName: 'Saturday',
date: 'December 19 2020',
},
],
//Another Week Array
//Another Week Array
//Etc
]
有人知道我如何在飞镖和长笛中实现这种类型的数据吗?
谢谢!
正如Stefano所写,创建一个具有能够实现目标的结构的类是很好的。我的建议比较简单,因为我刚刚写了一个你可以使用的方法。您甚至可以在DateTime类上创建一个扩展,并在将来使用它,或者在静态类中实现它,或者将它添加到实例类中。以下是适用于DartPad的完整示例:
void main() {
var weeks = getWeeksForRange(DateTime.utc(2020,08,12), DateTime.utc(2020,10,12));
print(weeks);
}
List<List<DateTime>> getWeeksForRange(DateTime start, DateTime end) {
var result = List<List<DateTime>>();
var date = start;
var week = List<DateTime>();
while(date.difference(end).inDays <= 0) {
// start new week on Monday
if (date.weekday == 1 && week.length > 0) {
print('Date $date is a Monday');
result.add(week);
week = List<DateTime>();
}
week.add(date);
date = date.add(const Duration(days: 1));
}
result.add(week);
return result;
}
此方法可以采用任意两个日期,并创建DateTime
对象的列表(周(列表。由于结果中会有许多DateTime结果,因此您可以根据需要对其进行映射,因为它们将包含有关日期、年份和工作日的所有信息,并保留格式设置功能。
第一步可以根据您的需要创建一个Class
:
class Day {
final DateTime dateTime;
Day({
this.dateTime,
});
String get day => DateFormat('EEEE').format(dateTime);
String get date => DateFormat('yMMMd').format(dateTime);
Map<String, String> toMap() => {'dayName': day, 'date': date};
}
我们可以用DateTime
构造上面的Class
,从中,我们可以使用getters中的DateFormat
导出day
和date
:
String get day => DateFormat('EEEE').format(dateTime); // returns "Friday" for example
String get date => DateFormat('yMMMd').format(dateTime); // returns "Jun 13, 2021" for example
toMap()
方法可以很容易地将Class
转换为Map<String, String>
:
Map<String, String> toMap() => {'dayName': day, 'date': date};
我们现在需要将Day
存储在List<Day>
:中
List<Day> days = [];
通过从起始DateTime
到结束DateTime
的迭代:
DateTime now = DateTime.now(); // as an example
DateTime start = now;
DateTime after = now.add(Duration(days: 180));
DateTime iterator = start;
List<Day> days = [];
while (iterator.isBefore(after)) {
days.add(Day(dateTime: iterator));
iterator = iterator.add(Duration(days: 1));
}
概述的场景的完整源代码可以在下面找到:
import 'package:intl/intl.dart';
class Day {
final DateTime dateTime;
Day({
this.dateTime,
});
String get day => DateFormat('EEEE').format(dateTime);
String get date => DateFormat('yMMMd').format(dateTime);
String toString() =>
't{ntt"dayName": "$day",ntt"date": "$date"nt}n';
Map<String, String> toMap() => {'dayName': day, 'date': date};
}
void main() {
DateTime now = DateTime.now();
DateTime start = now;
DateTime after = now.add(Duration(days: 180));
DateTime iterator = start;
List<Day> days = [];
while (iterator.isBefore(after)) {
days.add(Day(dateTime: iterator));
iterator = iterator.add(Duration(days: 1));
}
print(days);
}
如果您想按周对Day
进行分组,那么我们需要一个多维List
:
void main() {
DateTime now = DateTime.now();
DateTime start = now;
DateTime after = now.add(Duration(days: 180));
DateTime iterator = start;
List<List<Day>> days = [[]]; // multi-dimensional List
int i = 0;
while (iterator.isBefore(after)) {
if (days[i].isEmpty) days.add([]); // init of the week List
days[i].add(Day(dateTime: iterator));
if (iterator.weekday == 7) i++; // new week
iterator = iterator.add(Duration(days: 1));
}
print(days);
}