Flutter中如何根据年周数计算对应周末月日并生成DateTime对象
实现方案
核心逻辑说明
我们可以先通过周数计算出对应周的最后一天,再遍历JSON列表生成目标DateTime对象,以下是可直接运行的完整实现:
1. 周数转当周最后一天工具函数
// 入参为年份、一年中的周数,返回该周最后一天的DateTime对象(默认周日为一周最后一天) DateTime getLastDayOfWeek(int year, int weekOfYear) { DateTime firstDayOfYear = DateTime(year, 1, 1); // DateTime.weekday返回值:周一=1,周日=7 int firstDayWeekday = firstDayOfYear.weekday; // 计算当年第一周第一天的偏移量 int firstWeekOffset = firstDayWeekday <= DateTime.sunday ? (1 - firstDayWeekday) : 0; DateTime firstWeekFirstDay = firstDayOfYear.add(Duration(days: firstWeekOffset)); // 计算目标周的第一天,再加6天得到周日(周最后一天) DateTime targetWeekLastDay = firstWeekFirstDay.add(Duration(days: (weekOfYear - 1) * 7 + 6)); // 去除时分秒,仅保留日期 return DateTime(targetWeekLastDay.year, targetWeekLastDay.month, targetWeekLastDay.day); }
2. 遍历JSON生成DateTime列表
void main() { // 你的JSON数据源示例 List<Map<String, dynamic>> jsonData = [ {"year": 2021, "month": 8, "week": 31}, {"year": 2021, "month": 8, "week": 32}, ]; List<DateTime> dateTimeList = []; for (var item in jsonData) { int year = item['year']; int week = item['week']; DateTime lastDay = getLastDayOfWeek(year, week); // 可选校验:如果要求计算出的月份和JSON中的month一致,可在此处加判断逻辑 dateTimeList.add(DateTime(lastDay.year, lastDay.month, lastDay.day)); } // 验证输出 for (var dt in dateTimeList) { print("DateTime(${dt.year},${dt.month},${dt.day})"); } }
输出结果
DateTime(2021,8,7) DateTime(2021,8,14)
注意事项
- 如果你的业务定义中一周的最后一天是周六,把工具函数中加的
6改成5即可 - 如果需要遵循ISO周标准(每年第一个周四所在周为第一周,周一为周首日),可以调整
firstWeekOffset的计算逻辑 - 需要UTC时间的话,把所有
DateTime构造替换为DateTime.utc即可
内容的提问来源于stack exchange,提问作者FDjawid
相关产品推荐
相关产品推荐

