首页 > 解决方案 > Flutter - 需要所有 7 个星期六的日期

问题描述

我试图让所有 7 个星期六的日期都比今天的日期少。

表示今天的日期是 9 月 22 日,因此需要所有 7 个星期六,即 18/09/2021,11/09/2021,04/09/2021,28/08/2021,21/08/2021,14/08/2021,07/ 08/2021。

所以这是我尝试过的代码,但在这里,我打印了两次日期。

import 'package:intl/intl.dart';

void main() {
  
  findLastOfPreviousWee2(DateTime dateTime) {
    var dayOfWeek = 6;
    print(dateTime.weekday);
    return dateTime.subtract(Duration(days: dateTime.weekday - dayOfWeek));
  }
  findLastOfPreviousWee1(DateTime dateTime) {
    var sameWeekDayOfLastWeek =
    dateTime.subtract(const Duration(days: 6));
    print(sameWeekDayOfLastWeek);
    return findLastOfPreviousWee2(sameWeekDayOfLastWeek);
  }
  
  findLastOfPreviousWeek(DateTime dateTime) {
    var sameWeekDayOfLastWeek =
    dateTime.subtract(const Duration(days: 6));
    print(sameWeekDayOfLastWeek);
    return findLastOfPreviousWee1(sameWeekDayOfLastWeek);
  }
  
  findLastOfPreviousWeek1(DateTime dateTime) {
    var sameWeekDayOfLastWeek =
    dateTime.subtract(const Duration(days: 6));
    print(sameWeekDayOfLastWeek);
    return findLastOfPreviousWeek(sameWeekDayOfLastWeek);
  }
  
  findLastOfPreviousWeek2(DateTime dateTime) {
    var sameWeekDayOfLastWeek =
    dateTime.subtract(const Duration(days: 6));
    print(sameWeekDayOfLastWeek);
    return findLastOfPreviousWeek1(sameWeekDayOfLastWeek);
  }
  
  findLastOfPreviousWeek3(DateTime dateTime) {
    var sameWeekDayOfLastWeek =
    dateTime.subtract(const Duration(days: 6));
    print(sameWeekDayOfLastWeek);
    return findLastOfPreviousWeek2(sameWeekDayOfLastWeek);
  }
  
  findLastOfPreviousWeek4(DateTime dateTime) {
    var sameWeekDayOfLastWeek =
    dateTime.subtract(const Duration(days: 6));
    print(sameWeekDayOfLastWeek);
    return findLastOfPreviousWeek3(sameWeekDayOfLastWeek);
  }
  
  findLastOfPreviousWeek5(DateTime dateTime) {
    var sameWeekDayOfLastWeek =
    dateTime.subtract(const Duration(days: 6));
    print(sameWeekDayOfLastWeek);
    return findLastOfPreviousWeek4(sameWeekDayOfLastWeek);
  }
  
  print(DateFormat('dd/MM/yyyy')
    .format(findLastOfPreviousWee2(DateTime.parse('20210922'))));
  
  print(DateFormat('dd/MM/yyyy')
    .format(findLastOfPreviousWee1(DateTime.parse('20210922'))));
  
  print(DateFormat('dd/MM/yyyy')
    .format(findLastOfPreviousWeek(DateTime.parse('20210922'))));
  
  print(DateFormat('dd/MM/yyyy')
    .format(findLastOfPreviousWeek1(DateTime.parse('20210922'))));
  
  print(DateFormat('dd/MM/yyyy')
    .format(findLastOfPreviousWeek2(DateTime.parse('20210922'))));
  
  print(DateFormat('dd/MM/yyyy')
    .format(findLastOfPreviousWeek3(DateTime.parse('20210922'))));
  
  print(DateFormat('dd/MM/yyyy')
    .format(findLastOfPreviousWeek4(DateTime.parse('20210922'))));
  
  print(DateFormat('dd/MM/yyyy')
    .format(findLastOfPreviousWeek5(DateTime.parse('20210922'))));
}

我在飞镖垫上跑过这个。

我只是想从今天的日期或小于今天的日期开始获取最后 7 个星期六的日期。

标签: flutterdatetimedart

解决方案


那很有趣 !

对我来说有两个重要的元素:

  1. 如何获得上一个星期六
  2. 如何获得前x个星期六

1.如何获取上周六

在这里,您需要了解一些关于模数的知识,诀窍是找到从给定日期中减去的天数以找到上一个星期六:

DateTime findPreviousSaturday({required DateTime from}) {
  // Get the number of days to go back to find a saturday
  final daysFromSaturday = (from.weekday - DateTime.saturday) % 7;

  return from.subtract(Duration(days: daysFromSaturday));
}

如何获得前x个星期六

在这里你可以写 7 次相同的东西,或者应用编程的第一定律:偷懒。您可以创建一个递归函数,给定 acount将返回count给定日期的前一个星期六。这是它的工作原理:

  • 如果 count = 0,则返回一个空列表
  • 否则,返回前一个星期六使用并从前一周findPreviousSaturday获取星期六count - 1

这是代码:

List<DateTime> findPreviousSaturdays({
  required int count,
  DateTime? from,
}) {
  // End recursion
  if (count == 0) {
    return [];
  }

  // Defaults to now
  final _from = from ?? DateTime.now();

  return [findPreviousSaturday(from: _from)] +
      findPreviousSaturdays(
        count: count - 1,
        from: _from.subtract(Duration(days: 7)),
      );
}

享受

要使用它,只需调用:

void main() {
  print(findPreviousSaturdays(count: 7));
}

几乎没有工作,您可以将其扩展到一周中的任何一天:)


推荐阅读