Flutter如何基于起止时间与间隔生成时间槽列表?
如何基于给定时间范围和间隔生成时间槽列表
问题描述
现有以下字符串格式的时间变量:
String startTime = "08:30"; String closeTime = "22:00"; String space = "00:30";
需要生成包含所有时间间隔点的列表,示例如下:
[08:30, 09:00, 09:30, .... 21:30, 22:00]
当前实现的问题与改进方案
你的代码框架可行,但存在几个细节问题需要调整:
- 方法参数依赖手动拆分的时分值,无法直接适配你现有的字符串格式变量
- 循环逻辑会跳过初始的
startTime,导致列表开头缺失08:30,且不会包含结束时间22:00 - 方法内部依赖外部的
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
相关产品推荐
相关产品推荐

