You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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):

  1. 在build.gradle中添加依赖:
implementation 'com.jakewharton.threetenabp:threetenabp:1.4.0'
  1. 在Application类中初始化:
@Override
public void onCreate() {
    super.onCreate();
    AndroidThreeTen.init(this);
}
  1. 代码和上面类似,只是导入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:42:15