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

Dart/Flutter 如何实现生成过去12个月份列表的功能?

Dart 生成过去12个月月份列表的实现方案

问题原因

原有代码直接通过当前月份 - 遍历索引的方式获取月份值,当索引大于当前月份时,会生成小于1的无效月份值,在自定义的1-12月映射中无法匹配到对应值,因此输出null,同时也没有处理跨年的月份跳转逻辑。

推荐实现方式

Dart 内置的DateTime类本身支持月份的加减运算,会自动处理跨年、大小月的边界逻辑,不需要手动维护月份映射规则,有两种实现方案可选:

方案1:保留自定义月份映射(无第三方依赖)

直接通过DateTime的月份减法获取合法的月份值,避免出现无效数值:

void getListOfMonthAYear() {
  Map<int, String> listOfMonth = {
    1: 'January',
    2: 'February',
    3: 'March',
    4: 'April',
    5: 'May',
    6: 'June',
    7: 'July',
    8: 'August',
    9: 'September',
    10: 'October',
    11: 'November',
    12: 'December'
  };
  DateTime currentDate = DateTime.now();
  // 遍历12次,每次往前推1个月
  for (int i = 1; i <= DateTime.monthsPerYear; i++) {
    DateTime targetMonth = DateTime(currentDate.year, currentDate.month - i, 1);
    // 输出纯月份名,需要带年份自行拼接 targetMonth.year
    print(listOfMonth[targetMonth.month]);
  }
}

方案2:使用intl包格式化(更推荐,支持多语言)

官方维护的intl包提供了日期格式化能力,不需要手动写月份映射,还可以灵活调整输出格式、适配多语言:

  1. 先在pubspec.yaml中添加依赖
dependencies:
  intl: ^0.18.1
  1. 实现代码:
import 'package:intl/intl.dart';

// 返回带年份的月份列表,格式示例:August 2021
List<String> getPast12Months() {
  List<String> monthList = [];
  DateTime currentDate = DateTime.now();
  // 自定义输出格式,仅输出月份名用'MMMM',带年份用'MMMM yyyy'
  DateFormat formatter = DateFormat('MMMM yyyy');
  for (int i = 1; i <= 12; i++) {
    DateTime targetDate = DateTime(currentDate.year, currentDate.month - i, 1);
    monthList.add(formatter.format(targetDate));
  }
  return monthList;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 08:12:03