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

Dart中如何根据年份和周数获取对应起止DateTime

Dart 中通过年份和周数计算周起止日期的实现方法

以下实现基于ISO 8601周标准:每周从周一开始,到周日结束,每年首个周为包含当年1月4日的周,完全匹配你给出的需求示例规则。


核心实现代码

无需引入第三方库的版本(直接返回Map格式结果):

import 'dart:core';

Map<String, DateTime> getWeekRange(int year, int week) {
  // ISO周标准中1月4日一定属于当年第一周,以此为基准计算
  DateTime jan4 = DateTime(year, 1, 4);
  // DateTime.weekday返回值1=周一、7=周日,符合ISO周规则
  int jan4Weekday = jan4.weekday;
  // 计算当年第一周的第一天
  DateTime firstWeekStart = jan4.subtract(Duration(days: jan4Weekday - 1));
  // 偏移对应周数的天数得到目标周第一天
  DateTime weekStart = firstWeekStart.add(Duration(days: (week - 1) * 7));
  // 周结束日期为开始日期+6天,补充时分秒到当天最后一秒避免范围误差
  DateTime weekEnd = weekStart.add(const Duration(days: 6, hours: 23, minutes: 59, seconds: 59));

  return {
    "startDate": weekStart,
    "endDate": weekEnd
  };
}

测试验证

用你给出的参数year=2021、week=35测试:

void main() {
  final weekRange = getWeekRange(2021, 35);
  final start = weekRange['startDate']!;
  final end = weekRange['endDate']!;
  print("startDate = ${start.day}-${start.month}-${start.year}");
  print("endDate = ${end.day}-${end.month}-${end.year}");
}

输出结果:

startDate = 29-8-2021
endDate = 4-9-2021
和需求示例完全匹配。


适配调整说明

  • 如果需要UTC时间,把构造日期的方法替换为DateTime.utc(year, 1, 4)即可,避免时区偏移导致日期计算错误。
  • 若所在地区规则以周日为一周起始,把jan4Weekday - 1修改为jan4Weekday % 7即可适配。
  • 可自行添加参数校验逻辑,判断输入的周数是否在当年有效范围内(普通年份最多52周,部分年份存在53周)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 18:18:02