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

Android中如何按字符串日期对Customer对象排序?

解决Android中按日期字符串排序Customer对象的问题

嘿,我一眼就看出你卡在哪了——日期格式字符串和实际的日期格式不匹配,直接导致了解析异常,进而让你的排序逻辑完全失效了!

问题根源

你的日期是19.Jul.2019这种「日.英文月份缩写.年」的格式,但你用的SimpleDateFormat("dd/MM/yyyy")是用来匹配「日/数字月/年」的,两者完全不对应,自然会抛出ParseException。更糟的是,异常发生后你直接返回了0,这会让Comparator认为两个Customer对象的日期相等,排序结果当然会乱掉。

修正方案一:修复SimpleDateFormat的格式字符串

把格式改成和你的日期匹配的dd.MMM.yyyy,同时记得指定英文Locale(避免不同系统的Locale导致月份缩写解析失败),还要改进异常处理逻辑(别直接返回0):

public static Comparator<Customer> dateNewOld = new Comparator<Customer>() {
    @Override
    public int compare(Customer o1, Customer o2) {
        // 指定英文Locale,确保Jul等英文月份缩写能被正确解析
        DateFormat dateFormatter = new SimpleDateFormat("dd.MMM.yyyy", Locale.ENGLISH);
        try {
            Date date1 = dateFormatter.parse(o1.date);
            Date date2 = dateFormatter.parse(o2.date);
            // 倒序排序(最新日期在前)
            return date2.compareTo(date1);
        } catch (ParseException e) {
            // 不要直接返回0,这里可以抛出运行时异常提醒错误,或者把解析失败的日期放到末尾
            throw new RuntimeException("日期解析失败,请检查格式: " + o1.date + " / " + o2.date, e);
            // 如果想容忍错误,比如把解析失败的日期排到最后:
            // return Boolean.compare(o1.date == null || o1.date.trim().isEmpty(), o2.date == null || o2.date.trim().isEmpty());
        }
    }
};

更推荐的方案二:使用Java 8+的日期API(Android API 26+ 或兼容库)

SimpleDateFormat是线程不安全的,而且Java 8之后的日期API(java.time包)更健壮、易用。如果你的项目支持Android API 26+,可以直接用LocalDate和DateTimeFormatter;如果要兼容旧版本,可以引入ThreeTenABP库:

public static Comparator<Customer> dateNewOld = new Comparator<Customer>() {
    // 初始化一次Formatter,避免重复创建
    private final DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd.MMM.yyyy", Locale.ENGLISH);

    @Override
    public int compare(Customer o1, Customer o2) {
        try {
            LocalDate date1 = LocalDate.parse(o1.date, dateFormatter);
            LocalDate date2 = LocalDate.parse(o2.date, dateFormatter);
            // 倒序排序
            return date2.compareTo(date1);
        } catch (DateTimeParseException e) {
            throw new RuntimeException("日期格式错误,请检查: " + o1.date + " / " + o2.date, e);
        }
    }
};

最后一步:执行排序

不管用哪个方案,最后调用Collections.sort()时传入你的Comparator即可:

Collections.sort(yourCustomerArrayList, Customer.dateNewOld);

别忘了确认你的Customer类的date字段确实是19.Jul.2019这种格式,没有多余的空格、标点错误哦!

内容的提问来源于stack exchange,提问作者Anas khan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:16:39