Android开发:如何获取并展示指定日期至今的年、月、日间隔时长
解决Android中日期间隔(年、月、日)的计算问题
直接用总天数除以365/30来转换年月是不靠谱的——毕竟不同年份有闰年、不同月份天数也不一样,很容易算出错误结果。下面给你两种靠谱的实现方式,适配不同的Android版本:
方法一:使用原生Calendar类(兼容所有Android版本)
既然你已经在用Calendar,那可以通过逐年/逐月累加的方式来统计间隔,避免日期计算的坑:
// 先复制旧日期的Calendar实例,避免修改原对象 Calendar oldCal = (Calendar) oldCalendarDate.clone(); Calendar currentCal = Calendar.getInstance(); int years = 0; // 逐年累加,直到超过当前日期为止 while (true) { oldCal.add(Calendar.YEAR, 1); if (oldCal.after(currentCal)) { oldCal.add(Calendar.YEAR, -1); break; } years++; } int months = 0; // 逐月累加,同样直到超过当前日期 while (true) { oldCal.add(Calendar.MONTH, 1); if (oldCal.after(currentCal)) { oldCal.add(Calendar.MONTH, -1); break; } months++; } // 最后计算剩余的天数差 long daysDiff = TimeUnit.MILLISECONDS.toDays(currentCal.getTimeInMillis() - oldCal.getTimeInMillis()); // 拼接成你需要的格式 String intervalStr = years + "年、" + months + "个月、" + daysDiff + "天";
这个方法会自动处理闰年、不同月份天数的问题,比如你举的例子:02/02/2017到04/30/2018,会准确算出1年、2个月、28天。
方法二:使用Java 8+的LocalDate(推荐,API 26+或兼容库)
如果你的App支持API 26及以上,或者愿意引入ThreeTenABP兼容库(适配低版本Android),用LocalDate会更简洁直观,代码可读性也更高:
适配API 26+的原生实现:
// 将Calendar转换为LocalDate LocalDate oldDate = oldCalendarDate.toInstant() .atZone(ZoneId.systemDefault()) .toLocalDate(); LocalDate currentDate = LocalDate.now(); // 先计算年数 int years = Period.between(oldDate, currentDate).getYears(); LocalDate tempDate = oldDate.plusYears(years); // 基于年数后的日期计算月数 int months = Period.between(tempDate, currentDate).getMonths(); tempDate = tempDate.plusMonths(months); // 最后计算剩余天数 long days = ChronoUnit.DAYS.between(tempDate, currentDate); // 拼接结果 String intervalStr = years + "年、" + months + "个月、" + days + "天";
低版本Android适配(引入ThreeTenABP):
- 在build.gradle中添加依赖:
implementation 'com.jakewharton.threetenabp:threetenabp:1.4.0'
- 在Application类中初始化:
@Override public void onCreate() { super.onCreate(); AndroidThreeTen.init(this); }
- 代码和上面类似,只是导入
org.threeten.bp.LocalDate、org.threeten.bp.Period等类即可。
为什么不能直接用总天数转换?
举个例子:如果旧日期是2017-03-01,当前日期是2018-04-30,总天数是425天。如果用425/365=1年,剩下60天60/30=2个月,得到1年2个月,但实际正确结果是1年1个月29天——因为3月到4月只有30天,剩下29天。所以必须用日期类的API来处理,才能保证准确性。
内容的提问来源于stack exchange,提问作者user4106398
相关产品推荐
相关产品推荐

