Dart:循环生成15分钟间隔时间槽及FormatException报错排查
问题解决与代码实现
错误原因
DateTime.parse('08:00')会抛出格式异常,因为DateTime.parse要求输入符合完整的RFC 3339日期时间格式(如2024-05-20 08:00),单独的HH:mm格式无法被直接解析。
修正后的完整代码
import 'package:intl/intl.dart'; String getTimeRange(int index, DateTime startTime) { const interval = Duration(minutes: 15); var start = startTime.add(interval * index); var end = start.add(interval); var formatTime = DateFormat('HH:mm').format; return '${formatTime(start)}-${formatTime(end)}'; } void main() { // 指定开始时间,基于当前日期构造完整DateTime对象 final startTime = DateFormat('HH:mm').parse('08:00'); // 生成96个时间槽(覆盖24小时内所有15分钟间隔) final slots = [ for (var i = 0; i < 96; i++) <String, dynamic>{ 'id': i + 1, 'time': getTimeRange(i, startTime), 'slotNumber': '${i + 1}'.padLeft(2, '0'), 'clicked': false, }, ]; slots.forEach(print); }
关键修正说明
- 正确解析起始时间:用
DateFormat('HH:mm').parse('08:00')替代DateTime.parse('08:00'),DateFormat能正确识别单独的时分格式,并返回基于当前日期的完整DateTime对象。 - 灵活传入起始时间:将起始时间作为参数传入
getTimeRange函数,支持任意指定起始时刻。 - 覆盖完整24小时:循环次数设为96,正好对应24小时内的所有15分钟间隔时段。
- 时间范围计算逻辑:通过累加15分钟间隔得到每个时段的起始时间,再加15分钟得到结束时间,最后统一格式化为
HH:mm字符串拼接成时间范围。
输出示例(前4条)
{id: 1, time: 08:00-08:15, slotNumber: 01, clicked: false} {id: 2, time: 08:15-08:30, slotNumber: 02, clicked: false} {id: 3, time: 08:30-08:45, slotNumber: 03, clicked: false} {id: 4, time: 08:45-09:00, slotNumber: 04, clicked: false}
内容的提问来源于stack exchange,提问作者coolhack7
相关产品推荐
相关产品推荐

