如何计算起始日期与另外两个日期的秒级及毫秒级时间差?
计算起始时间到目标时间的秒数+毫秒数
核心思路
System.currentTimeMillis()返回的是从1970年1月1日00:00:00 UTC到当前时间的毫秒数,直接用目标时间戳减去起始时间戳,就能得到两者间经过的毫秒数。再将这个差值转换为「秒数.三位毫秒数」的格式即可。
代码实现方案
方案1:浮点数直接计算(简洁直观)
long firstDate = System.currentTimeMillis(); long secondDate = System.currentTimeMillis(); long thirdDate = System.currentTimeMillis(); // 计算时间差(毫秒) long diffSecond = secondDate - firstDate; long diffThird = thirdDate - firstDate; // 转换为秒+毫秒的小数形式 double elapsedSecond = diffSecond / 1000.0; double elapsedThird = diffThird / 1000.0; // 格式化输出为固定三位小数,匹配示例格式 System.out.printf("firstDate = 0.000%n"); System.out.printf("secondDate= %.3f%n", elapsedSecond); System.out.printf("thirdDate = %.3f%n", elapsedThird);
方案2:拆分秒和毫秒(避免浮点数精度问题)
如果担心浮点数精度误差,可以直接拆分整数秒和剩余毫秒,再拼接成字符串:
long firstDate = System.currentTimeMillis(); long secondDate = System.currentTimeMillis(); long thirdDate = System.currentTimeMillis(); // 计算时间差(毫秒) long diffSecond = secondDate - firstDate; long diffThird = thirdDate - firstDate; // 拆分秒和毫秒 long secSecond = diffSecond / 1000; long msSecond = diffSecond % 1000; long secThird = diffThird / 1000; long msThird = diffThird % 1000; // 格式化输出,确保毫秒部分是三位(不足补0) System.out.println("firstDate = 0.000"); System.out.printf("secondDate= %d.%03d%n", secSecond, msSecond); System.out.printf("thirdDate = %d.%03d%n", secThird, msThird);
说明
- 两种方案都能输出你需要的「x.xxx」格式结果,方案2更适合对精度要求较高的场景。
- 示例中
firstDate固定显示为0.000,是因为它作为起始时间,自身到自身的时间差为0。
内容的提问来源于stack exchange,提问作者UshRosi
相关产品推荐
相关产品推荐

