Flutter:如何根据周数获取指定星期对应的日期
解决Flutter根据周数、星期列表和年份获取对应日期的问题
原代码问题分析
你的代码直接将周数*7天加到当年1月1日,既没考虑周的起始规则(周从周一开始),也没针对指定星期几做偏移,所以结果和预期不符。
解决方案
我们需要先定位目标周的周一,再根据目标星期几做天数偏移,最后格式化日期。具体步骤如下:
- 添加依赖:需要用
intl包格式化日期,在pubspec.yaml中添加:
dependencies: flutter: sdk: flutter intl: ^0.18.1
- 修正后的代码:
import 'package:intl/intl.dart'; void main() { int weekNumber = 2; List<int> weekdays = [1, 2, 5]; // 1=周一,2=周二,5=周五 int year = 2023; // 获取当年1月1日的日期对象 final jan1 = DateTime(year); final jan1Weekday = jan1.weekday; // DateTime.weekday: 1=周一,7=周日 // 计算第一周周一相对于1月1日的偏移天数 int firstMondayOffset; if (jan1Weekday == 1) { firstMondayOffset = 0; // 1月1日就是周一 } else { // 计算到下一个周一的天数 firstMondayOffset = 8 - jan1Weekday; } // 计算目标周的周一日期 final targetWeekMonday = jan1.add( Duration(days: firstMondayOffset + (weekNumber - 1) * 7), ); // 生成目标星期的日期并格式化 final targetDates = weekdays.map((weekday) { final date = targetWeekMonday.add(Duration(days: weekday - 1)); return DateFormat('yyyy-MM-dd').format(date); }).toList(); print(targetDates.join(', ')); // 输出:2023-01-09, 2023-01-10, 2023-01-13 }
代码说明
- 定位第一周周一:根据1月1日的星期数,计算到当年第一个周一的偏移天数。
- 计算目标周周一:在第一周周一的基础上,加上
(周数-1)*7天,得到目标周的周一。 - 生成目标日期:针对每个目标星期几,在目标周周一的基础上加上
(星期数-1)天(周一对应偏移0天)。 - 格式化日期:使用
DateFormat将日期转为yyyy-MM-dd的字符串格式,去掉多余的时间部分。
内容的提问来源于stack exchange,提问作者Mat Koffman
相关产品推荐
相关产品推荐

