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

Android中如何计算两个日期的天、时(24制)、分、秒差值

解决Android中两个日期的天/时/分/秒精确差值计算问题

我明白你现在卡在计算两个日期的精确差值上了——要拆成天、24小时制的小时、分钟、秒确实容易踩坑,尤其是用旧的SimpleDateFormat和Date类的时候。先看看你的代码,其实解析日期的思路是对的,但可能在后续计算差值的步骤上没处理好,我来帮你完善整个流程。

方案一:使用旧版Date+SimpleDateFormat(兼容低版本Android)

你的代码已经完成了日期解析,接下来只需要计算毫秒差,再逐步拆解成天、时、分、秒即可,注意要避免整除时的精度丢失:

try {
    String FinalDate = "20-04-2018 08:00:00";
    String CurrentDate = "26-04-2018 10:10:30";
    
    SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss", Locale.getDefault());
    Date date1 = sdf.parse(CurrentDate);
    Date date2 = sdf.parse(FinalDate);
    
    // 计算两个日期的毫秒差值(注意顺序:当前日期 - 目标日期,得到正数差值)
    long diffMillis = date1.getTime() - date2.getTime();
    
    // 拆解差值:天、小时、分钟、秒
    long days = diffMillis / (1000 * 60 * 60 * 24);
    long remainingMillis = diffMillis % (1000 * 60 * 60 * 24);
    
    long hours = remainingMillis / (1000 * 60 * 60);
    remainingMillis = remainingMillis % (1000 * 60 * 60);
    
    long minutes = remainingMillis / (1000 * 60);
    long seconds = remainingMillis % (1000 * 60) / 1000;
    
    // 输出结果:6天2小时10分钟30秒
    Log.d("DateDiff", String.format("%d天 %d小时 %d分钟 %d秒", days, hours, minutes, seconds));
} catch (ParseException e) {
    e.printStackTrace();
    // 处理日期解析异常,比如格式不匹配
}

关键注意点:

  • 一定要指定Locale,避免不同地区的日期解析错误(比如某些地区的月份格式差异)
  • 注意日期的顺序:如果要计算CurrentDate比FinalDate晚多少,就用date1.getTime() - date2.getTime(),反之则调换顺序,避免出现负数差值
  • 拆解时用取余运算保留剩余的毫秒数,确保每一步的精度

方案二:使用Java 8+时间API(推荐,更简洁可靠)

从Android 8.0(API 26)开始,Android支持Java 8的java.time包,如果你应用的minSdkVersion >=26,或者使用了coreLibraryDesugaring,强烈推荐用这个方案——旧的Date和SimpleDateFormat类是线程不安全的,而且API设计不够直观,容易出现时区、闰年等边界问题,而java.time包完美解决了这些痛点:

try {
    String FinalDate = "20-04-2018 08:00:00";
    String CurrentDate = "26-04-2018 10:10:30";
    
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm:ss", Locale.getDefault());
    LocalDateTime dateTime1 = LocalDateTime.parse(CurrentDate, formatter);
    LocalDateTime dateTime2 = LocalDateTime.parse(FinalDate, formatter);
    
    // 计算差值
    Duration duration = Duration.between(dateTime2, dateTime1);
    
    long days = duration.toDays();
    long hours = duration.toHours() % 24;
    long minutes = duration.toMinutes() % 60;
    long seconds = duration.getSeconds() % 60;
    
    Log.d("DateDiff", String.format("%d天 %d小时 %d分钟 %d秒", days, hours, minutes, seconds));
} catch (DateTimeParseException e) {
    e.printStackTrace();
}

补充:兼容低版本Android

如果你的应用需要支持API 26以下,可以引入ThreeTenABP库(Android版的Java 8时间API),在build.gradle中添加依赖:

implementation 'com.jakewharton.threetenabp:threetenabp:1.4.5'

然后在Application类的onCreate中初始化库:

@Override
public void onCreate() {
    super.onCreate();
    AndroidThreeTen.init(this);
}

之后就可以像使用Java 8时间API一样编写代码,语法完全一致。

内容的提问来源于stack exchange,提问作者user8252960

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:37:33