在业务代码中排序时需要根据日期排序,写了如下代码
sorted((o1, o2) -> {
                    String str1 = null;
                    String str2 = null;
                    try {
                        Field field = getField(fieldMap, configBO.getCodeName());
                        str1 = String.valueOf(field.get(o1));
                        str2 = String.valueOf(field.get(o2));
                    } catch (Exception e) {
                        log.error("getDeclaredField error configBO.getCodeName(){}", configBO.getCodeName(), e);
                    }
                    
                    int order = new BigDecimal(StringUtils.isEmpty(str2)||"null".equals(str2) ? "0" : str2).compareTo(new BigDecimal(StringUtils.isEmpty(str1)||"null".equals(str1) ? "0" : str1));
                    if (order == 0) {
                        long time1 = DateUtil.getDateByStr(o1.getRecordDate(), DateUtil.yyyy_MM_dd).getTime();
                        long time2 = DateUtil.getDateByStr(o2.getRecordDate(), DateUtil.yyyy_MM_dd).getTime();
                        order = (int) (time1 - time2);
                    }
                    return order;
                })在日期排序时使用了getTime 来获取时间戳,然后时间戳相减后转为int作为order,这里会有类型转换问题,即下图:

两者相减的数据大于了int最大值,导致本应该是正数的一个值,int转换后是一个负数,导致排序混乱
修改也简单,把根据时间戳排序改为根据date自带的compareTo排序即可
 order = DateUtil.getDateByStr(o1.getRecordDate(), DateUtil.yyyy_MM_dd).compareTo(DateUtil.getDateByStr(o2.getRecordDate(), DateUtil.yyyy_MM_dd));


















