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包提供了日期格式化能力,不需要手动写月份映射,还可以灵活调整输出格式、适配多语言:
- 先在
pubspec.yaml中添加依赖
dependencies: intl: ^0.18.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
相关产品推荐
相关产品推荐

