在业务代码中排序时需要根据日期排序,写了如下代码
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));