Dart如何根据指定时间获取符合自定义规则的周时间范围
Dart 自定义周周期范围计算实现(周六7点起始)
核心实现逻辑
我们可以通过时间偏移对齐的方式简化计算,不需要复杂的周规则重写:
- 先将输入时间减去7小时,把自定义周的「周六7点」起始临界值对齐到自然日的周六0点
- 计算偏移后时间对应的最近一个周六的0点
- 把计算结果加回7小时,得到自定义周的起始时间,加7天即为周结束时间
- 全程建议使用UTC时间计算,避免夏令时导致的小时偏移异常
完整代码实现
/// 计算指定时间对应的自定义周范围(每周周六7点起始,下周六7点结束,左闭右开) /// [inputTime] 输入的指定时间,建议传入UTC时间避免时区问题 /// 返回 (周起始时间, 周结束时间) (DateTime, DateTime) getCustomWeekRange(DateTime inputTime) { // 步骤1:减去7小时,对齐周六0点临界值 final offsetTime = inputTime.subtract(const Duration(hours: 7)); // 步骤2:计算偏移时间对应的最近一个周六0点 final daysToSubtract = (offsetTime.weekday - 6 + 7) % 7; final lastSaturdayZero = DateTime.utc( offsetTime.year, offsetTime.month, offsetTime.day, ).subtract(Duration(days: daysToSubtract)); // 步骤3:加回7小时得到周起始,加7天得到周结束 final weekStart = lastSaturdayZero.add(const Duration(hours: 7)); final weekEnd = weekStart.add(const Duration(days: 7)); // 如果需要返回本地时间,调用toLocal()即可 return (weekStart, weekEnd); }
提示:如果你的项目使用Dart 3.0以下版本,不支持记录类型,可以将返回值改为
List<DateTime>,返回[weekStart, weekEnd]即可。
使用示例&测试验证
void main() { // 测试用例1:周六6:59,属于上一周 final testTime1 = DateTime.utc(2024, 10, 12, 6, 59); final range1 = getCustomWeekRange(testTime1); print('测试1 周起始: ${range1.$1}, 周结束: ${range1.$2}'); // 输出:周起始: 2024-10-05 07:00:00.000Z, 周结束: 2024-10-12 07:00:00.000Z // 测试用例2:周六7:01,属于新一周 final testTime2 = DateTime.utc(2024, 10, 12, 7, 01); final range2 = getCustomWeekRange(testTime2); print('测试2 周起始: ${range2.$1}, 周结束: ${range2.$2}'); // 输出:周起始: 2024-10-12 07:00:00.000Z, 周结束: 2024-10-19 07:00:00.000Z // 测试用例3:周中任意时间 final testTime3 = DateTime.utc(2024, 10, 15, 12, 00); // 周二 final range3 = getCustomWeekRange(testTime3); print('测试3 周起始: ${range3.$1}, 周结束: ${range3.$2}'); // 输出:周起始: 2024-10-12 07:00:00.000Z, 周结束: 2024-10-19 07:00:00.000Z }
注意事项
- 如果业务要求使用本地时区,把代码里的
DateTime.utc替换为DateTime即可,返回的时间也会是本地时区 - 时间范围默认是左闭右开规则,即
>= weekStart 且 < weekEnd为该周内时间,符合常规时间区间判断逻辑 - 若需要周结束时间为下周六6:59:59,把
weekEnd的计算改为weekStart.add(const Duration(days:7, microseconds: -1))即可
内容的提问来源于stack exchange,提问作者user16648824
相关产品推荐
相关产品推荐

