如何在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); }
原代码问题分析
- 正则语法错误:你写的
RegExp(r'|START(.*)END')多了开头的|,且未使用非贪婪模式.*?,可能匹配到无关内容;另外RegExp(START(.*)END')缺少开头引号,属于语法错误。 - 调用逻辑错误:
a[DateTime.parse(RegExp(...))]的写法完全错误,不能用DateTime对象作为字符串索引,正确流程是先提取时间字符串,再解析为DateTime,最后比较。
内容的提问来源于stack exchange,提问作者Mohammed Hamdan
相关产品推荐
相关产品推荐

