年龄计算器月转天计算结果错误问题求助
问题分析与修复方案
核心问题
你的总天数计算逻辑存在根本性误差:
- 用
30.433这种平均每月天数来转换月份到天数,属于近似估算,完全忽略了不同月份的实际天数差异(28/29/30/31天)、闰年2月的特殊情况,这是导致结果和在线工具不一致的直接原因。 - 代码里存在大量冗余的字符串转整数操作,
period.getYears()、period.getMonths()、period.getDays()本身就是int类型,无需额外转换。
修复后的代码
直接使用Java 8+提供的ChronoUnit.DAYS.between()方法计算精确总天数,替代手动转月份再转天数的错误逻辑:
int date1, year1, date2, year2, totalMonths, totalDays; date1 = Integer.parseInt(dateBox.getSelectedItem().toString()); year1 = Integer.parseInt(yearField.getText()); date2 = Integer.parseInt(atDateBox.getSelectedItem().toString()); year2 = Integer.parseInt(atYearField.getText()); /*-----------------Calculate Current Age----------------------------*/ LocalDate dob = LocalDate.of(year1, birthMonth, date1); LocalDate end = LocalDate.of(year2, currentMonth, date2); Period period = Period.between(dob, end); /*---------------------------Starting conversion-------------------------------*/ // 总月数计算逻辑保留(这部分没问题) totalMonths = period.getYears() * 12 + period.getMonths(); // 直接计算精确总天数,替代原近似转换 totalDays = (int) ChronoUnit.DAYS.between(dob, end); /*---------------------------End conversion-------------------------------*/ lblShowAns.setText(String.valueOf(period.getYears()) + " Years " + String.valueOf(period.getMonths()) + " Months " + String.valueOf(period.getDays()) + " Days "); lblShowMD.setText(String.valueOf(totalMonths) + " Months " + String.valueOf(period.getDays()) + " Days "); lblShowDate.setText(String.valueOf(totalDays) + " Days ");
修复说明
ChronoUnit.DAYS.between()会自动处理所有日期细节:不同月份的天数差异、闰年、平年,直接给出两个日期之间的精确天数差,结果会和在线工具完全一致。- 移除了冗余的类型转换操作,代码更简洁高效。
内容的提问来源于stack exchange,提问作者CSE
相关产品推荐
相关产品推荐

