解决思路
一般常见的思路有两种:利用Calendar 和 利用Date;
利用 java.util.Calendar
使用的大致方法如下:
但是 你会发现实际使用的时候会出现问题,因为使用的是减法,会出现 负数,也就是说意味着需要向前借位。
不过 做也是能做,但是需要从秒 -> 年 ,从小到大,然后记录是否需要借位,如代码块二,但也是较为复杂
所以 不推荐使用吧
Calendar c1 = Calendar.getInstance();
c1.setTime(startTime);
Calendar c2 = Calendar.getInstance();
c2.setTime(endTime);
int yearDiff = c2.get(Calendar.YEAR) - c1.get(Calendar.YEAR);
if (yearDiff != 0) {
durationStr += yearDiff + "年";
}
int mouthDiff = c2.get(Calendar.MONTH) - c1.get(Calendar.MONTH);
if (mouthDiff != 0) {
durationStr += mouthDiff + "月";
}
int dayDiff = c2.get(Calendar.DAY_OF_MONTH) - c1.get(Calendar.DAY_OF_MONTH);
if (dayDiff != 0) {
durationStr += dayDiff + "日";
}
int hourDiff = c2.get(Calendar.HOUR) - c1.get(Calendar.HOUR);
if (hourDiff != 0) {
durationStr += hourDiff + "时";
}
int minuteDiff = c2.get(Calendar.MINUTE) - c1.get(Calendar.MINUTE);
if (minuteDiff != 0) {
durationStr += minuteDiff + "分";
}
int secondDiff = c2.get(Calendar.SECOND) - c1.get(Calendar.SECOND);
if (secondDiff != 0) {
durationStr += secondDiff + "秒";
}
代码块二
private String getDurationTimer(Date startTime, Date endTime) {
String durationStr = "";
boolean hasBorrow = false;
Calendar c1 = Calendar.getInstance();
c1.setTime(startTime);
Calendar c2 = Calendar.getInstance();
c2.setTime(endTime);
int secondDiff = c2.get(Calendar.SECOND) - c1.get(Calendar.SECOND);
if (secondDiff != 0) {
if (secondDiff < 0) {
hasBorrow = true;
secondDiff = 60 + secondDiff;
}
durationStr = secondDiff + "秒";
}
int minuteDiff = c2.get(Calendar.MINUTE) - c1.get(Calendar.MINUTE);
if (hasBorrow) {
minuteDiff = minuteDiff - 1;
hasBorrow = false;
}
if (minuteDiff != 0) {
if (minuteDiff < 0) {
hasBorrow = true;
minuteDiff = 60 + minuteDiff;
}
durationStr += minuteDiff + "分";
}
int hourDiff = c2.get(Calendar.HOUR) - c1.get(Calendar.HOUR);
if (hasBorrow) {
hourDiff = hourDiff - 1;
hasBorrow = false;
}
if (hourDiff != 0) {
if (hourDiff < 0) {
hasBorrow = true;
hourDiff = 24 + hourDiff;
}
durationStr += hourDiff + "时";
}
......
return durationStr;
}
利用 java.util.Date 【推荐使用】
这里的主要是对两个时间时间戳之差的处理,利用了Date的 getTime() 方法。代码如下:
说明 这里利用了 “/”和“%” ,比较简洁的实现了需求。
private String getDuration(Date startTime, Date endTime) {
String durationStr = "";
long diff = endTime.getTime() - startTime.getTime();
long day = diff / (1000 * 60 * 60 * 24);
diff = diff % (1000 * 60 * 60 * 24);
if (day != 0) {
durationStr += day + "天";
}
long hour = diff / (1000 * 60 * 60);
diff = diff % (1000 * 60 * 60);
if (hour != 0) {
durationStr += hour + "时";
}
long minute = diff / (1000 * 60);
diff = diff % (1000 * 60);
if (minute != 0) {
durationStr += minute + "分";
}
long second = diff / (1000);
if (second != 0) {
durationStr += second + "秒";
}
return durationStr;
}
注意 这里的结果可能出现这种情况:1时2秒 或者 1时2分,如果需要改成:1时0分2秒 或者 1时2分0秒 需要按照需求规则来判断