flutter 如何在季度和半年的模式中增加和减少日期?

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

下面是我尝试过的每月模式的例子。日期需要在点击按钮时获得增量。增量和减量按钮添加和减去日期。
如何增加周线格式?

import 'package:flutter/material.dart';
import 'package:flutter_base/src/common_widget/custom_app_bar.dart';
import 'package:flutter_base/utils/app_colors.dart';
import 'package:flutter_base/utils/decorations.dart';

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

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

class _DateCounterState extends State<DateCounter> {
  var _selectedMonthlyStartDate = DateTime.now();
  final _inputStartFormat = DateFormat('dd-MM-yyyy');
  var month;
  var monthEnd;
  late DateTime startDateTime;
  late DateTime endDateTime;

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    startDateTime = DateTime(DateTime.now().year, DateTime.now().month, 1);
    month = _inputStartFormat.format(startDateTime);

    endDateTime = DateTime(DateTime.now().year, DateTime.now().month + 1, 0);
    monthEnd = _inputStartFormat.format(endDateTime);
  }

  //output : 19-02-23 to 25-02-23 how to increase this weekly format
  DateTime findFirstDateOfTheWeek(DateTime dateTime) {
    return dateTime.subtract(Duration(days: dateTime.weekday));
  }

  DateTime findLastDateOfTheWeek(DateTime dateTime) {
    return dateTime.add(Duration(days: DateTime.daysPerWeek - dateTime.weekday - 1));
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: CustomAppBar(
        context,
        isTrailingButtonLastVisible: false,
        isBackButtonVisible: true,
        titleVisible: true,
        titleColor: AppColors.colorBlack,
        fontWeight: FontWeight.bold,
        fontSize: 16,
        isTrailingButtonVisible: true,
      
      ),
      body: Center(
        child: Row(
          mainAxisAlignment: MainAxisAlignment.spaceEvenly,
          children: [
            InkWell(
              onTap: (){
                monthSubtractFunc();
              }, child: Container(
              width: 30,
                height: 30,
                color: Colors.grey,
                child: const Center(child: Text("-")))),
            Text("$month To $monthEnd"),
            InkWell(
              onTap: (){
                monthAddFunc();
              },
                child: Container(
                  width: 30,
                    height: 30,
                    color: Colors.grey,
                    child: Center(child: Text("+"))))
          ],
        ),
      ),
    );
  }

  void monthAddFunc(){
    _selectedMonthlyStartDate = DateTime(_selectedMonthlyStartDate.year,
        _selectedMonthlyStartDate.month + 1, 1);
    month = _inputStartFormat.format(_selectedMonthlyStartDate);
    _selectedMonthlyStartDate = DateTime(_selectedMonthlyStartDate.year,
        _selectedMonthlyStartDate.month + 1, 0);
    monthEnd = _inputStartFormat.format(_selectedMonthlyStartDate);
    setState(() {});
  }

  void monthSubtractFunc(){
    _selectedMonthlyStartDate = DateTime(_selectedMonthlyStartDate.year,
        _selectedMonthlyStartDate.month - 1, 1);
    month = _inputStartFormat.format(_selectedMonthlyStartDate);
    _selectedMonthlyStartDate = DateTime(_selectedMonthlyStartDate.year,
        _selectedMonthlyStartDate.month + 1, 0);
    monthEnd = _inputStartFormat.format(_selectedMonthlyStartDate);
    setState(() {});
  }
}

我的输出需要类似于“2023年1月1日”至“2023年3月31日”=〉正向点击=〉“2023年4月1日”至“2023年6月30日”负向按钮减少3个月。
如果有人知道解决办法,请帮助...谢谢。

fumotvh3

fumotvh31#

添加两个函数:

DateTime endDate(DateTime startDate) {
    return DateTime(startDate.year, startDate.month + 3, 1).add(const Duration(days: -1));
  }

  DateTime addMonths(DateTime date, int months) {
    return DateTime(date.year, date.month + months, 1);
  }

然后在您的init中调用它们:

void initState() {
    super.initState();
    startDateTime = DateTime(DateTime.now().year, DateTime.now().month, 1);
    endDateTime = endDate(startDateTime);
  }

在增加/减少功能中:

void monthAddFunc() {
    startDateTime = addMonths(startDateTime, 3);
    endDateTime = endDate(startDateTime);
    setState(() {});
  }

  void monthSubtractFunc() {
    startDateTime = addMonths(startDateTime, -3);
    endDateTime = endDate(startDateTime);
    setState(() {});
  }

然后使用您想要的任何格式来显示日期。
endDate函数基于输入日期创建一个新日期,添加三个月并将其设置为该月的第一天,然后删除一天以获得正确的该月的最后一天。

cwtwac6a

cwtwac6a2#

我猜你错过了什么,在DateTime类中有一个构建,它可以让你做以下事情:

DateTime startTime = DateTime.now();
startTime.add(const Duration(day: 60)); // Adds two month.

你也可以这样做

DateTime startTime = DateTime.now();
startTime.copyWith(
month: startTime.month + 2,
); // Adds two month.

但是如果你增加超过12个月的时间,这种方法会产生问题。所以对于这种情况,你需要做一些检查和额外的工作。

相关问题