【问题标题】:How to get a list of each week in a time range with Dart?如何使用 Dart 获取时间范围内每周的列表?
【发布时间】:2020-12-16 15:04:42
【问题描述】:

我正在尝试在我的 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
]

有谁知道我怎样才能在 Dart 和 Flutter 中实现这种类型的数据?

谢谢!

【问题讨论】:

  • 你能解释一下,你到底想要什么?

标签: flutter date datetime dart


【解决方案1】:

正如 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 结果,因此您可以根据需要对它们进行映射,因为它们将包含有关其日期、年份、工作日的所有信息,并将保留格式设置功能。

【讨论】:

  • 非常感谢。但由于某种原因,您的代码每周只输出 6 个项目(天)。为什么不是 7?
  • @F.SO7 感谢您的关注!我修复了它并编辑了我的答案。这是一个小问题。这能回答你的问题吗?
  • 嘿,@F.SO7,看看我的更新。我对其进行了一些更改,因为在 2022 年 11 月 1 日使用 DayTime 会产生错误,因为过渡到夏令时。为了避免这种情况,我没有使用DateTime 对象,而是使用了DateTime.utc。这解决了这个问题。为了更清晰,我还将hours: 24 更改为days: 1
【解决方案2】:

第一步可以根据您的需要创建一个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,然后我们可以在getter 中使用DateFormat 派生daydate

 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&lt;String, String&gt;

Map<String, String> toMap() => {'dayName': day, 'date': date};

我们现在需要将Days 存储在List&lt;Day&gt; 中:

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{\n\t\t"dayName": "$day",\n\t\t"date": "$date"\n\t}\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);
}

如果您想按周对Days 进行分组,那么我们需要一个多维的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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-09
    • 2022-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多