如何在flutter中增加和减少周格式的日期?

bq9c1y66  于 2023-02-25  发布在  Flutter
关注(0)|答案(2)|浏览(190)

每周递增和递减计数器的点击按钮。如何实现这一点在Flutter。

class DateCounter extends StatefulWidget {
  const DateCounter({Key? key}) : super(key: key);

  @override
  State<DateCounter> createState() => _DateCounterState();
}

class _DateCounterState extends State<DateCounter> {
  final _inputStartFormat = DateFormat('dd-MM-yyyy');
  var weekFirstDay;
  var weekLastDay;
  late DateTime startDateTime;
  late DateTime endDateTime;

  @override
  void initState() {
    super.initState();

    startDateTime = DateTime(DateTime.now().year, DateTime.now().month, DateTime.now().day);
    weekFirstDay = _inputStartFormat.format(startDateTime);
    debugPrint("start new $startDateTime");
    endDateTime = endDateWeekly(startDateTime);
    debugPrint("start end $endDateTime");
    weekLastDay = _inputStartFormat.format(endDateTime);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.spaceEvenly,
          children: [
            InkWell(
              onTap: (){
                weeklySubtractFunc();
              }, child: Container(
                width: 30,
                height: 30,
                color: Colors.grey,
                child: const Center(child: Text("-")))),
            Text("$weekFirstDay To $weekLastDay"),
            InkWell(
              onTap: (){
                weeklyAddFunc();
              },
                child: Container(
                  width: 30,
                    height: 30,
                    color: Colors.grey,
                    child: const Center(child: Text("+"))))
          ],
        ),
      ),
    );
  }

  DateTime endDateWeekly(DateTime startDate) {
    return DateTime(startDate.year, startDate.month, startDate.day)
        .add(const Duration(days: 7 - 1));
  }

  DateTime addWeekly(DateTime date, int days, bool isForward) {
    return
      DateTime(date.year, date.month, isForward ? date.day + 7 : date.day - 7);
  }

  void weeklyAddFunc() {
    startDateTime = addWeekly(startDateTime, 7, true);
    weekFirstDay = _inputStartFormat.format(startDateTime);
    endDateTime = endDateWeekly(startDateTime);
    weekLastDay = _inputStartFormat.format(endDateTime);
    debugPrint("add Func $startDateTime");
    debugPrint("add Func 2 $endDateTime");
    setState(() {});
  }

  void weeklySubtractFunc() {
    startDateTime = addWeekly(startDateTime, -7, false);
    weekFirstDay = _inputStartFormat.format(startDateTime);
    endDateTime = endDateWeekly(startDateTime);
    weekLastDay = _inputStartFormat.format(endDateTime);
    debugPrint("sub Func $startDateTime");
    debugPrint("sub Func 2 $endDateTime");
    setState(() {});
  }
}

最初,需要将当前周的开始和结束日期显示为19-02-2023至25-02-2023递减按钮,需要将上一周显示为12-02-2023至18-02-2023递增按钮,需要将下一周显示为26-02-2023至04-03-2023。

lskq00tm

lskq00tm1#

DateTime getNewDateTime(DateTime date, int days, bool isForward) {
  return isForward
      ? date.add(Duration(days: days))
      : date.subtract(Duration(days: days));
}
uubf1zoe

uubf1zoe2#

也许有更好的方法用日期函数来做到这一点,但这是我想出的。
添加一个函数,通过回溯到正确的工作日来确定一周的开始(您希望它从星期日开始,即工作日= 7):

DateTime getStartOfWeek(DateTime date) {
    var newDate = DateTime(date.year, date.month, date.day);
    while (newDate.weekday != 7) {
      newDate = newDate.add(const Duration(days: -1));
    }
    return newDate;
  }

然后,只需添加6天以获得本周末,或添加7天以获得下周/上周:

DateTime getEndOfWeek(DateTime startOfWeek) {
    return startOfWeek.add(const Duration(days: 6));
  }

  DateTime getNextWeek(DateTime startOfWeek) {
    return startOfWeek.add(const Duration(days: 7));
  }

  DateTime getPreviousWeek(DateTime startOfWeek) {
    return startOfWeek.add(const Duration(days: -7));
  }

因此,首先获取当前周的开始时间和同一周的结束时间:

@override
  void initState() {
    super.initState();
    startDate = getStartOfWeek(DateTime.now());
    endDate = getEndOfWeek(startDate);
  }

然后在onTap事件中使用上述函数设置新状态:

void increaseWeek() {
    setState((){
      startDate = getNextWeek(startDate);
      endDate = getEndOfWeek(startDate);
    });
  }

  void decreaseWeek() {
    setState((){
      startDate = getPreviousWeek(startDate);
      endDate = getEndOfWeek(startDate);
    });
  }

相关问题