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
相关产品推荐
相关产品推荐

