今天在做一个项目时,遇到了 如图所示 的时间格式需求,想了很久、也尝试了很多前后端代码的处理方式,思前想后决定写个工具类方便大家以后使用。
话不多说,直接上工具类代码
// 计算两个Date类型时间相差的时长,返回字符串格式-->例如:( 2年6月23日23时26分18秒 )如要修改格式修改源码即可
public static String getTimeDiffString(Date d1, Date d2) throws ParseException {
// 分别获取传入的两个时间的毫秒值
long time1 = d1.getTime();
long time2 = d2.getTime();
// 计算两个时间所差的秒值,这里使用系统封装的Math类abs()绝对值方法做处理,这样就可以忽略传参时间的大小顺序,从而一定能得出一个正确的差值
long diff = Math.abs((time1 - time2) / 1000);// 除以1000求出的是相差的秒值,秒*1000=毫秒
// 这里提前把换算 年、月、日 等表达式写好,下面方便运算处理
/* 注:这里就不做闰年平年、30天31天处理了,后续有时间可能会补上 */
long year = 60 * 60 * 24 * 365; // 年和秒之间的换算表达式
long month = 60 * 60 * 24 * 30; // 月和秒之间的换算表达式
long day = 60 * 60 * 24; // 日和秒之间的换算表达式
long hour = 60 * 60; // 小时和秒之间的换算表达式
long minute = 60; // 分钟和秒之间的换算表达式
// 用上面求出的时间差diff(秒)进行运算
long yearDiff = diff / year; // yearDiff求出的值即为相差的年份
long restYear = diff % year; // 差值 % 年 取余 求restYear求出的值即为多出来的不到一年的秒值
// 用多出来不到一年的值来继续进行运算
long monthDiff = restYear / month; // monthDiff求出的值即为相差的月份
long restMonth = restYear % month; // restMonth=多出来不到一个月的秒值
// 用多出来不到一个月的值来继续进行运算
long dayDiff = restMonth / day; // dayDiff求出的值即为相差的天数
long restDay = restMonth % day; // restDay=多出来不到一天的秒值
// 用多出来不到一天的值来进行运算
long hourDiff = restDay / hour; // hourDiff求出的值即为相差的小时数
long restHour = restDay % hour; // restHour=多出来不到一个小时的秒值
// 用多出来不到一个小时的值来进行运算
long minuteDiff = restHour / minute; // minuteDiff求出的值即为相差的天数
long restMinute = restHour % minute; // restMinute=多出来不到一天的秒值
// 最后进行字符串拼接
String str = yearDiff + "年" + monthDiff + "月" + dayDiff + "日" + hourDiff + "时" + minuteDiff + "分" + restMinute + "秒";
// 可根据业务需求修改字符串打印的值
return str; // 大功告成
}
这里就偷个小懒,不进行平年闰年、30天、31天等情况的判断啦,后续有时间可能会补上,嘻嘻~
安排测试代码及效果
上图中箭头所示的工具类代码附在文末,非常简单,下面看上图中未注释的两个时间的测试效果
细心的朋友可以看到天数的不精确,原因是平年闰年,30天、31天所致,嘻嘻~
接下来看测试代码中注释的两个时间的测试效果
没毛病哈铁子!!
最后附上上图所用到的工具类代码(将srting类型字符串转化为date)
// 将srting类型字符串转化为date public static Date getDateFromString(String str, String pattern) throws ParseException { // 这里的传参就不做异常判断了 // pattern为自定义转换规则 SimpleDateFormat sdf = new SimpleDateFormat(pattern); // 调用SimpleDateFormat类的parse方法进行格式转换 return sdf.parse(str); }
补:由于担心有朋友不知道在哪里使用该工具类,这里特地补充,如下图箭头处所示
最终效果如图所示:
如有错误,欢迎指正
Thanks