Flutter中String.compareTo为何两类测试场景均返回-1?
Flutter中String.compareTo()返回-1的原因分析
你测试的代码如下:
print("case 1>>>>> "); print("02 Dec 2022".compareTo("24 Nov 2022")); print("case 2>>>>> "); print("24 Nov 2022".compareTo("24 Nov 2022")); print("case 3>>>>> "); print("23 Nov 2022".compareTo("24 Nov 2022"));
测试结果里case2返回0很直观——两个字符串完全一致,compareTo在字符串相等时返回0。而case1和case3都返回-1,核心原因是String类的compareTo是按Unicode码点逐字符做字典序比较,不是按日期语义比较。
具体场景拆解:
case3:"23 Nov 2022" vs "24 Nov 2022"
逐字符对比到第二个字符时,'3'的Unicode码是51,'4'是52,51 < 52,所以前者被判定为小于后者,直接返回-1。case1:"02 Dec 2022" vs "24 Nov 2022"
第一个字符就出现差异:'0'的Unicode码是48,'2'是50,48 < 50,此时compareTo已经得出前者小于后者的结论,不会再往后比较月份部分。你可能误以为它会识别日期格式并按时间先后比较,但String的compareTo完全不具备语义解析能力,只看字符的Unicode顺序。
正确的日期比较方式
如果要按日期逻辑比较,需要先把字符串转换为DateTime对象,再调用DateTime的compareTo:
DateTime date1 = DateTime.parse("02 Dec 2022"); DateTime date2 = DateTime.parse("24 Nov 2022"); print(date1.compareTo(date2)); // 返回1,因为12月2日晚于11月24日
内容的提问来源于stack exchange,提问作者Jaimin Modi
相关产品推荐
相关产品推荐

