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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 22:54:04