本人是代码菜鸟
首先按照从其他地方介绍的普遍的计算方式,Date.getTime获取日期时间的long值来相减
//设置Date格式为“年-月-日 小时:分钟:秒.毫秒”
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
//设置时间,String转为Date
String strStart = "2019-11-11 11:11:50.5";
String strEnd = "2019-11-11 11:11:50.555";
Date dateStart = sdf.parse(strStart);
Date dateEnd = sdf.parse(strEnd);
//直接获取Date的long值相减
long duration = dateEnd.getTime() - dateStart.getTime();
System.out.println("duration:" + duration);
得到结果为
这里计算似乎不对,只看末尾的秒,难道不是应该等于下面这个么?
50.555 - 50.5 = 0.055
这个是以秒为单位的结果,转换为毫秒*1000则结果为 55
来输出Date.getTime()一下康康(getTime()返回Date的long值)
String strStart = "2019-11-11 11:11:50.5";
String strEnd = "2019-11-11 11:11:50.555";
...
System.out.println("dateStart.getTime:" + dateStart.getTime());
System.out.println("dateEnd.getTime:" + dateEnd.getTime());
控制台输出结果为
注意看dateStart,原来是小数点后补0时,Date类默认补在前面了,所以需要对strStart末尾补0再转为Date
整个程序完整代码如下
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateDuration {
public static void main(String[] args) throws ParseException {
//设置时间,String转为Date
String strStart = "2019-11-11 11:11:50.5";
String strEnd = "2019-11-11 11:11:50.555";
long duration = calculateDuration(strStart,strEnd);
System.out.println("duration:" + duration);
}
/**计算日期时长,以毫秒为单位返回
* @author mingliuTester
* @param strStart 开始日期时间字符串
* @param strEnd 结束日期时间字符串
* @throws ParseException
*/
public static long calculateDuration(String strStart, String strEnd) throws ParseException{
//设置Date格式为“年-月-日 小时:分钟:秒.毫秒”
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
//字符串补0
strStart = addZero(strStart);
strEnd = addZero(strEnd);
//String转换为Date类型
Date dateStart = sdf.parse(strStart);
Date dateEnd = sdf.parse(strEnd);
System.out.println("dateStart.getTime:" + dateStart.getTime());
System.out.println("dateEnd.getTime:" + dateEnd.getTime());
//对date的long值相减得到以毫秒为单位相减的结果,Date.getTime()获取long值
long duration = dateEnd.getTime() - dateStart.getTime();
return duration;
}
/**末尾补0,这里以保留小数点到后三位为例
* @author mingliuTester
* @param str
*/
public static String addZero(String str){
//计算字符串长度和点的位置差值
int pointPosition = str.length() - str.lastIndexOf('.');
//根据位置差值补0
switch (pointPosition){
//正好保留到小数点后3位
case 4:
break;
//正好保留到小数点后2位
case 3:
str += "0";
//正好保留到小数点后1位
case 2:
str += "00";
//默认当做没有保留小数
default:
str += ".000";
break;
}
return str;
}
}
得到输出结果
完美!