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

Flutter如何基于起止时间与间隔生成时间槽列表?

如何基于给定时间范围和间隔生成时间槽列表

问题描述

现有以下字符串格式的时间变量:

String startTime = "08:30";
String closeTime = "22:00";
String space = "00:30";

需要生成包含所有时间间隔点的列表,示例如下:

[08:30, 09:00, 09:30, .... 21:30, 22:00]

当前实现的问题与改进方案

你的代码框架可行,但存在几个细节问题需要调整:

  1. 方法参数依赖手动拆分的时分值,无法直接适配你现有的字符串格式变量
  2. 循环逻辑会跳过初始的startTime,导致列表开头缺失08:30,且不会包含结束时间22:00
  3. 方法内部依赖外部的selectedDate,耦合性过高

改进后的完整实现

import 'package:intl/intl.dart';

List<String> createTimeSlotList(String startTimeStr, String closeTimeStr, String spaceStr, DateTime selectedDate) {
  // 解析字符串格式的开始时间
  List<String> startParts = startTimeStr.split(':');
  int openingHour = int.parse(startParts[0]);
  int openingMin = int.parse(startParts[1]);
  
  // 解析字符串格式的结束时间
  List<String> closeParts = closeTimeStr.split(':');
  int closingHour = int.parse(closeParts[0]);
  int closingMin = int.parse(closeParts[1]);
  
  // 解析字符串格式的间隔时间(转换为分钟)
  List<String> spaceParts = spaceStr.split(':');
  int intervalMinutes = int.parse(spaceParts[0]) * 60 + int.parse(spaceParts[1]);

  DateTime startTime = DateTime(selectedDate.year, selectedDate.month, selectedDate.day, openingHour, openingMin);
  DateTime endTime = DateTime(selectedDate.year, selectedDate.month, selectedDate.day, closingHour, closingMin);
  Duration step = Duration(minutes: intervalMinutes);

  List<String> timeSlots = [];
  // 先添加初始开始时间
  timeSlots.add(DateFormat.Hm().format(startTime));
  
  DateTime currentTime = startTime;
  while (true) {
    DateTime nextTime = currentTime.add(step);
    // 下一个时间超过结束时间则停止循环
    if (nextTime.isAfter(endTime)) {
      break;
    }
    timeSlots.add(DateFormat.Hm().format(nextTime));
    currentTime = nextTime;
  }
  
  // 确保结束时间被包含(当间隔刚好整除时间范围时)
  if (!timeSlots.contains(DateFormat.Hm().format(endTime))) {
    timeSlots.add(DateFormat.Hm().format(endTime));
  }
  
  print(timeSlots);
  return timeSlots;
}

关键调整说明

  • 新增字符串时间解析逻辑,直接接收你现有的字符串变量作为参数,无需手动拆分时分
  • 先将初始的startTime加入列表,避免遗漏开头的时间点
  • 调整循环判断逻辑,确保不会添加超出范围的时间
  • 最后检查并补充结束时间,保证列表末尾包含closeTime
  • 将selectedDate作为参数传入,降低方法与外部变量的耦合性

使用示例

// 调用方法生成时间槽
DateTime selectedDate = DateTime.now();
List<String> timeSlots = createTimeSlotList("08:30", "22:00", "00:30", selectedDate);
// 输出结果:[08:30, 09:00, 09:30, ..., 21:30, 22:00]

内容的提问来源于stack exchange,提问作者Tolga Yılmaz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 02:57:25