其他
网上找的一段代码突然爆了,项目出现大Bug!
1、《往期精选优秀博文都在这里了!》 2、Serializable:明明就一个空接口!为什么还要实现它? 3、1.3万亿条数据查询如何做到毫秒级响应? 4、技术大佬:我去,你写的 switch 语句也太老土了吧! 5、23个带答案的Zookeeper经典面试题!
public static int differentDays(Date date1, Date date2) {
Calendar cal1 = Calendar.getInstance();
cal1.setTime(date1);
Calendar cal2 = Calendar.getInstance();
cal2.setTime(date2);
int day1 = cal1.get(Calendar.DAY_OF_YEAR);
int day2 = cal2.get(Calendar.DAY_OF_YEAR);
int year1 = cal1.get(Calendar.YEAR);
int year2 = cal2.get(Calendar.YEAR);
if (year1 != year2) {
//同一年
int timeDistance = 0;
for (int i = year1; i < year2; i++) {
if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0) {
//闰年
timeDistance += 366;
} else {
//不是闰年
timeDistance += 365;
}
}
return timeDistance + (day2 - day1);
} else {
//不同年
System.out.println("判断day2 - day1 : " + (day2 - day1));
return day2 - day1;
}
}
differentDays("2020-1-1","2019-12-25")
理论上这么调用正确的结果是 -7,但是因为函数有 Bug,调用结果是 358。
于是本来不用发奖励,因为这种特殊情况一下子发出去 358 份,严重影响了游戏某类道具的平衡性。
最后,我改用 Java8 的日期库修复了 Bug,代码如下:
public static int differentDays(Date date1, Date date2) {
if (date1 == null || date2 == null) {
throw new RuntimeException("日期不能为空");
}
LocalDate localDate1 = date2LocalDate(date1);
LocalDate localDate2 = date2LocalDate(date2);
return Generic.long2int(localDate1.until(localDate2, ChronoUnit.DAYS));
}
public static LocalDate date2LocalDate(Date date) {
Instant instant = date.toInstant();
ZoneId zoneId = ZoneId.systemDefault();
LocalDate localDate = instant.atZone(zoneId).toLocalDate();
return localDate;
}