You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter如何实现周/月日期选择按钮并计算对应日期范围

Flutter 周/月日期区间选择实现方案

核心规则对齐:周维度区间不允许跨至上一年12月,若常规周起始日落入上年12月,直接截断为当月1日作为区间起点,两个维度的区间终点均为当前基准日期(默认取当天)。

核心逻辑实现

直接用Dart内置的DateTime类完成计算,无需引入第三方日期处理库。

import 'package:flutter/material.dart';

/// 周区间计算:不跨上年12月,起点自动截断到当月1日
DateTimeRange calcWeekRange(DateTime baseDate) {
  // 常规周起点(默认周一为每周第一天,需周日为起点可调整偏移值)
  final normalWeekStart = baseDate.subtract(Duration(days: baseDate.weekday - 1));
  // 当月第一天
  final monthFirstDay = DateTime(baseDate.year, baseDate.month, 1);
  // 周起点不能早于当月第一天,避免跨到上年12月
  final rangeStart = normalWeekStart.isBefore(monthFirstDay) ? monthFirstDay : normalWeekStart;
  // 区间终点为基准日期当天0点,规避时分秒误差
  final rangeEnd = DateTime(baseDate.year, baseDate.month, baseDate.day);
  return DateTimeRange(start: rangeStart, end: rangeEnd);
}

/// 月区间计算:固定从当月1日到基准日期
DateTimeRange calcMonthRange(DateTime baseDate) {
  final rangeStart = DateTime(baseDate.year, baseDate.month, 1);
  final rangeEnd = DateTime(baseDate.year, baseDate.month, baseDate.day);
  return DateTimeRange(start: rangeStart, end: rangeEnd);
}

按钮交互实现

在页面中嵌入两个选择按钮,点击时触发区间计算,拿到结果后直接对接业务逻辑即可:

class DateRangeSelector extends StatefulWidget {
  const DateRangeSelector({super.key});

  @override
  State<DateRangeSelector> createState() => _DateRangeSelectorState();
}

class _DateRangeSelectorState extends State<DateRangeSelector> {
  DateTimeRange? selectedRange;
  // 基准日期默认取当天,可根据业务需求替换为其他选中日期
  final DateTime baseDate = DateTime.now();

  @override
  Widget build(BuildContext context) {
    return Row(
      mainAxisSize: MainAxisSize.min,
      children: [
        ElevatedButton(
          onPressed: () {
            setState(() {
              selectedRange = calcWeekRange(baseDate);
              // 此处可添加区间选中后的业务逻辑,比如拉取对应时间范围的数据
            });
          },
          child: const Text('周'),
        ),
        const SizedBox(width: 16),
        ElevatedButton(
          onPressed: () {
            setState(() {
              selectedRange = calcMonthRange(baseDate);
              // 月区间选中后的业务逻辑
            });
          },
          child: const Text('月'),
        ),
      ],
    );
  }
}

适配说明

  • 若业务规则以周日为每周第一天,只需将周起点计算代码修改为final normalWeekStart = baseDate.subtract(Duration(days: baseDate.weekday));,截断逻辑无需调整,依然会自动规避跨上年12月的问题。
  • 所有日期构造均取当天0点,避免时分秒精度导致的区间匹配错误。
  • 如需格式化展示区间日期,可直接拼接start/end的年、月、日字段,或引入格式化工具自定义展示样式,不影响核心计算逻辑。

内容的提问来源于stack exchange,提问作者sanin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 12:01:12