dart /Flutter:日期范围内的天数列表

gopyfrb3  于 2023-10-13  发布在  Flutter
关注(0)|答案(5)|浏览(147)

我需要从日期范围中检索日期列表。用户选择开始日期和结束日期,并计算两者之间的天数(包括开始和结束)。
我尝试使用一个for循环,如下所示:

List<DateTime> calculateDaysInterval(DateTime startDate, DateTime endDate) {
    List<DateTime> days = [];
    for (DateTime d = startDate;
        d.isBefore(endDate);
        d.add(Duration(days: 1))) {
      days.add(d);
    }
    return days;
  }

但它不工作,它冻结了应用程序。你们有什么建议吗?先谢了。

ui7jx7zq

ui7jx7zq1#

怎么样:

final daysToGenerate = end.difference(start).inDays;
days = List.generate(daysToGenerate, (i) => DateTime(start.year, start.month, start.day + (i)));
bjp0bcyl

bjp0bcyl2#

我可能找到了解决办法。它看起来不怎么样,但它能完成任务。

List<DateTime> calculateDaysInterval(DateTime startDate, DateTime endDate) {
    List<DateTime> days = [];
    for (int i = 0; i <= endDate.difference(startDate).inDays; i++) {
      days.add(startDate.add(Duration(days: i)));
    }
    return days;
  }

如果你们有更好的方法,让我知道。

xkftehaa

xkftehaa3#

可能不是最有效的(实际上肯定不是有效的),但如果你必须绝对得到确切的天数,考虑到夏令时,这将工作。

DateTime startDate = new DateTime(2020, 3, 2);
DateTime endDate = new DateTime(2020, 3, 10);
List<DateTime> days = [];
DateTime tmp = DateTime(startDate.year, startDate.month, startDate.day, 12);
while(DateTime(tmp.year, tmp.month, tmp.day) != endDate){
  days.add(DateTime(tmp.year, tmp.month, tmp.day));
  tmp = tmp.add(new Duration(days: 1));
}
qgzx9mmu

qgzx9mmu4#

参考原始问题并尽可能保持代码相似,代码冻结应用的原因是因为for循环中的add函数不正确,而是返回一个新的DateTime,如下所示:

因此,为了修复代码,您需要做的就是将for循环的最后一部分更改为d = d.add(const Duration(days: 1))

zpjtge22

zpjtge225#

如果你在一个函数或类成员中实现Iterable(但你可以找到一个List对象),你仍然可以使用for循环或遍历日期范围,

Class DateFormatter { 
  .....
  ....

   static Iterable<DateTime> EachDay(DateTimeRange dateRange) {
     List<DateTime> iterated = [];
    
     for (var day = dateRange.start.day; day <= dateRange.end.day; day++) {
       iterated.add(dateRange.start.add(Duration(days: day)));
     }
     return iterated;
   }
}

和一个“for”循环,

for (DateTime cDate in DateFormatter.EachDay(dateRange)) {
  print(cDate.toString());
}

还有一种实现迭代器的方法,所有这些都在代码上留下了最小的足迹。使用迭代器,

var theITerator = DateFormatter.EachDay(dateRange).iterator;
    theITerator.moveNext();

相关问题