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
相关产品推荐
相关产品推荐

