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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 21:45:04