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

Flutter中如何移除列表内指定起止时间范围的字符串元素

Dart中过滤指定时间区间内元素的实现方案

现有代码问题梳理

  • 仅匹配了和startTime完全相等的元素,没有覆盖12:00 AM到2:00 AM的全区间
  • 正序遍历列表时直接删除元素会导致后续元素下标前移,出现漏判的情况
  • 12小时制的时间字符串无法直接比较大小,需要先转换为可比较的数值格式

实现步骤

  1. 先编写辅助方法将12小时制时间字符串转换为当日零点后的总分钟数,方便大小比较
  2. 提前把startTime和endTime转换为对应的总分钟数值
  3. 过滤列表时优先使用where方法,如果必须用for循环则选择倒序遍历避免漏判

完整可运行代码

void main() {
  late List<String> times;
  times = [
    "12:00 AM",
    "12:15 AM",
    "12:30 AM",
    "12:45 AM",
    "1:00 AM",
    "1:15 AM",
    "1:30 AM",
    "1:45 AM",
    "2:00 AM",
    "2:30 AM",
    "3:00 AM",
  ];
  String startTime = "12:00 AM";
  String endTime = "2:00 AM";

  // 辅助方法:把12小时制时间转成当日总分钟数
  int timeToMinutes(String timeStr) {
    List<String> parts = timeStr.split(' ');
    List<String> timeParts = parts[0].split(':');
    int hour = int.parse(timeParts[0]);
    int minute = int.parse(timeParts[1]);
    String period = parts[1];
    
    if (period == 'AM') {
      hour = hour == 12 ? 0 : hour;
    } else {
      hour = hour == 12 ? 12 : hour + 12;
    }
    return hour * 60 + minute;
  }

  int startMin = timeToMinutes(startTime);
  int endMin = timeToMinutes(endTime);

  // 方法1:简洁写法,直接用where过滤
  List<String> filteredTimes = times.where((time) {
    int currentMin = timeToMinutes(time);
    // 保留不在[startMin, endMin]区间内的时间
    return currentMin < startMin || currentMin > endMin;
  }).toList();

  print(filteredTimes); // 输出: [2:30 AM, 3:00 AM]

  // 方法2:如果必须使用for循环实现,用倒序遍历避免下标问题
  for (int i = times.length - 1; i >= 0; i--) {
    int currentMin = timeToMinutes(times[i]);
    if (currentMin >= startMin && currentMin <= endMin) {
      times.removeAt(i);
    }
  }
  print(times); // 输出: [2:30 AM, 3:00 AM]
}

运行结果

两种实现方式最终都会输出目标结果:["2:30 AM", "3:00 AM"]

内容的提问来源于stack exchange,提问作者Mohammed Nabil

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 14:24:03