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

如何在Dart中按最新时间排序含userId+DateTime的字符串列表

解决方案

方法一:直接从原始字符串提取时间(推荐)

你的字符串中,DateTime部分是固定格式的YYYY-MM-DD HH:MM:SS.sss,长度为23个字符,因此可以直接从每个元素末尾截取这部分内容,无需额外添加标识。

代码示例:

void main() {
  List<String> list = [
    '9DWXpF6V4vN8oxqvsHKnOBg2Rz2022-09-14 00:07:52.707',
    '8jk9wQ0U5gNyekzNz84SDb0jDTf12022-09-12 00:07:52.704',
    '0RMRZFCifmSe2CGW6k7Rvq8gvni2022-09-13 00:07:52.704'
  ];

  list.sort((a, b) {
    // 截取末尾23位作为时间字符串
    final timeStrA = a.substring(a.length - 23);
    final timeStrB = b.substring(b.length - 23);
    final dateTimeA = DateTime.parse(timeStrA);
    final dateTimeB = DateTime.parse(timeStrB);
    // 倒序排序,最新时间在前
    return dateTimeB.compareTo(dateTimeA);
  });

  print(list);
}

方法二:处理带START/END标识的列表

如果必须保留你添加的START和END标识,需要修正正则表达式的使用方式:

代码示例:

void main() {
  List<String> list = [
    '9DWXpF6V4vN8oxqvsHKnOBg2RzSTART2022-09-14 00:07:52.707END',
    '8jk9wQ0U5gNyekzNz84SDb0jDTf1START2022-09-12 00:07:52.704END',
    '0RMRZFCifmSe2CGW6k7Rvq8gvniSTART2022-09-13 00:07:52.704END'
  ];

  final timeRegex = RegExp(r'START(.*?)END');

  list.sort((a, b) {
    // 提取START与END之间的时间字符串
    final timeStrA = timeRegex.firstMatch(a)?.group(1);
    final timeStrB = timeRegex.firstMatch(b)?.group(1);
    
    // 处理匹配失败的边界情况
    if (timeStrA == null || timeStrB == null) return 0;
    
    final dateTimeA = DateTime.parse(timeStrA);
    final dateTimeB = DateTime.parse(timeStrB);
    
    return dateTimeB.compareTo(dateTimeA);
  });

  print(list);
}

原代码问题分析

  1. 正则语法错误:你写的RegExp(r'|START(.*)END')多了开头的|,且未使用非贪婪模式.*?,可能匹配到无关内容;另外RegExp(START(.*)END')缺少开头引号,属于语法错误。
  2. 调用逻辑错误:a[DateTime.parse(RegExp(...))]的写法完全错误,不能用DateTime对象作为字符串索引,正确流程是先提取时间字符串,再解析为DateTime,最后比较。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 03:50:24