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