最近有个需求,根据两个时间,计算两个时间之间相差多少个小时。
查了一下,网上有现成的工具类
摘出自己需要的。得到下面这个
private int getDifferHour(Date startDate, Date endDate) {
long dayM = 1000 * 24 * 60 * 60;
long hourM = 1000 * 60 * 60;
long differ = endDate.getTime() - startDate.getTime();
long hour = differ % dayM / hourM;
return Integer.parseInt(String.valueOf(hour));
}
但是自己测试了以后才发现,当两个时间超过一天以上,就会有问题。
设置两个时间小时数相同,天的日期不同,结果得到的结果却是:0
回过头看一下这个工具类,思路其实很明了,就是先根据Date类的getTime() 方法获取到两个时间的毫秒数,然后计算出两个日期的毫秒数之差。按理说,只要两个毫秒数之差 除以 天 再除以 小时的毫秒数,就能得到两个时间相差的小时数。
一天的毫秒数是1000 * 24 * 60 * 60,一个小时的毫秒数1000 * 60 * 60(1 秒 = 1000毫秒,一小时 = 60 分钟 * 60 秒 * 1000 毫秒)
但是上图中的计算方式
long hour = differ % dayM / hourM
却是先求余再取整,differ % dayM 在取余的时候把整数给舍弃了,所以当相隔天数大于一天的的时候,天数这个值竟然被我舍弃了。
舍弃一天,就舍弃24小时,那肯定是不对的。基于上面的方式,修改一下即可。
// 24 * (differ / dayM) 这里拿到被舍弃的整数,整数是几,就代表相隔几天,一天24小时,那就整数乘以24即可。
private static int getDifferHour(Date startDate, Date endDate) {
long dayM = 1000 * 24 * 60 * 60;
long hourM = 1000 * 60 * 60;
long differ = endDate.getTime() - startDate.getTime();
long hour = differ % dayM / hourM + 24 * (differ / dayM);
return Integer.parseInt(String.valueOf(hour));
}
另外有个小插曲,根据下面这个方式测试的时候,当把起始日期parse1和结束日期parse2分别改成
2021-08-27 12:00:00
2021-08-27 14:00:00
得到的答案竟然是14,也就是12:00:00变成了00:00:00
观察一下,发现原来是simpleDateFormat 实例化的时候,小时,使用小写的h。这就涉及到另一个知识点了。关于SimpleDateFormat对象参数的大小写问题。HH 代表24小时制,hh 代表12小时制。在12小时制中,12点会被当成0点处理。所以将hh改成 HH就可以了
附:java判断俩个时间之间差的小时数,分钟数,秒数
给出任意两个时间, 计算出该时间段内白天小时数, 夜晚小时数, 以及白天次数夜晚次数,
白天时间段为 7:00-21:00;
@Slf4j
public class DateTest {
// 给出任意两个时间, 计算出该时间段内白天小时数, 夜晚小时数, 以及白天次数夜晚次数,
// 白天为 7:00-21:00; 白 14 夜 10
/**
* 先计算俩个时间之间的差多少天,在计算中间差多少个小时
* 开始 结束
* 正 正(正常的都包括7点和21点俩个时间点)
* 不 正 (小于7 或大于21)
* 不 不(都小于7 或都大于21)
* 正 不 (小于7 或大于21)
* 不 不 (都不正常) 6 23 或 23 6
*/
public static void main(String[] args) throws Exception {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date beginDate = sdf.parse("2020-6-20 20:59:00");
Date endDate = sdf.parse("2020-6-20 22:59:00");
System.out.println(sdf.format(beginDate));
System.out.println(sdf.format(endDate));
testDate(beginDate, endDate);
}
private static void testDate(Date beginDate, Date endDate) throws Exception {
if (beginDate.getTime() > endDate.getTime() || beginDate.equals(endDate)) {
log.info("结束时间必须比开始时间早");
return;
}
int w = 14, b = 10;//w 白天总小时数 b 黑夜小时数
int whour = 0;//白天小时数
int bhour = 0;//夜晚小时数
int wcs = 0;//白天次数
int bcs = 0;//夜晚次数
long nd = 1000 * 24 * 60 * 60;// 一天的毫秒数
long nh = 1000 * 60 * 60;// 一小时的毫秒数
long bl = 10000;//小时计算变量
long beginDateTime = beginDate.getTime();
long endDateTime = endDate.getTime();
//相隔天数的总毫秒数
long diff = endDateTime - beginDateTime;
long day = diff / nd;// 计算差多少天
long hour = diff % nd / nh + day * 24;// 计算差多少小时
//先计算整天的的数量
if (day > 0) {
whour += w * day;
bhour += b * day;
wcs += day;
bcs += day;
}
//算出整天的小时数和总小时数不相等,说明有多余的小时数
if (day * 24 != hour) {
SimpleDateFormat sdf1 = new SimpleDateFormat("HH:mm:ss");
long date1Time = Long.parseLong(sdf1.format(beginDate).replace(":", ""));
long date2Time = Long.parseLong(sdf1.format(endDate).replace(":", ""));
long wb = 70000;//07:00:00 白天开始时间
long we = 210000;//21:00:00 白天结束时间
long zero = 240000;//24:00:00 0点分界值
//1.开始正常 结束正常
if (date1Time >= wb && date1Time <= we
&& date2Time >= wb && date2Time <= we) {
if (date2Time > date1Time) {//结束>开始
//13 14 相当于 多了俩个时间差
whour += (date2Time - date1Time) / bl;
wcs += 1;
} else if (date2Time < date1Time) {
// 14 13 差俩个差够一天,所以先算白天的 :当前
whour += ((we - date1Time) / bl) + ((date2Time - wb) / bl);
bhour += b;
//开始小于等于21 并且结束大于7点说明有白天时间段
if (date1Time <= we && date2Time > wb) {
wcs += 1;
}
bcs += 1;
}
}
//2.开始不正常 结束正常
if (date2Time >= wb && date2Time <= we) {
if (date1Time > we || date1Time < wb) {
if (date1Time > we) { //开始 > 21
//21 13
//先计算今天的黑夜再加上7个小时
long l = zero - date1Time;
long hou = l / bl;
bhour += hou + 7;
bcs += 1;
} else if (date1Time < wb) {
//5
// 先算离白天7点的黑夜小时
bhour += (wb - date1Time) / bl;
bcs += 1;
}
//结束正常,算超出的小时数
whour += (date2Time - wb) / bl>1?(date2Time - wb) / bl:1;
//判断当天开始时间超过白天段再让加一
if (date1Time < we && date1Time >= wb && date2Time <= zero
//开始小于21,并且结束大于7小于21说明有白天时间段
|| date1Time < we && date2Time < zero && date2Time > wb) {
wcs += 1;
}
}
}
//3.开始不正常 结束不正常 都小于7 都大于21
if (date1Time < wb && date2Time < wb ||
date1Time > we && date2Time > we) {
if (date2Time > date1Time) { //结束 >开始
//4 3
//23 22
//相当于一天多了俩个时间的差的小时,并且是黑夜
bhour += (date2Time - date1Time) / bl;
bcs += 1;
} else if (date2Time < date1Time) { // 结束 <开始
//6 4
//先计算 离7点的黑夜数
bhour += (wb - date1Time) / bl + date2Time / bl + 3;
//差俩个时间差为一整天,所以白天都有
whour += w;
wcs += 1;
bcs += 1;
}
}
//4.开始正常 结束不正常 小于7 大于21
if (date1Time >= wb && date1Time <= we) {
if (date2Time < wb || date2Time > we) {
if (date2Time < wb) { //结束 < 7
//14 6
//先结算正常白天的小时数,黑夜=加上到24的3个小时+结束的黑夜小时数
bhour += 3 + date2Time / bl;
bcs += 1;
} else if (date2Time > we) {//结束 >21
//14 22
//他大于21 进入黑夜 黑夜数等于超出的小时数
bhour += (date2Time - we) / bl;
bcs += 1;
}
whour += (we - date1Time) / bl>1?(we - date1Time) / bl:1;
//判断当天开始时间超过白天段再让加一
if (date1Time < we && date1Time >= wb && date2Time <= zero
//只有开始小于21才有白天段
|| date1Time < we && date2Time < zero && date2Time > wb) {
wcs += 1;
}
}
}
//5.开始不正常 结束不正常
if (date1Time < wb && date2Time > we
|| date1Time > we && date2Time < wb) {
if (date1Time < wb && date2Time > we) { // 6 23
//先计算黑夜,到7点的黑夜+结束超出的小时数
bhour += (wb - date1Time) / bl + (date2Time - we) / bl;
whour += w;
wcs += 1;
bcs += 1;
}
if (date1Time > we && date2Time < wb) {// 23 6
//先结算今天到凌晨的黑夜数+明天的黑夜数
bhour += (zero - date1Time) / bl + date2Time / bl;
bcs += 1;
}
}
//判断分钟是否是00,当前是不是整点,多一秒就按一个小时算
if (date1Time % bl != 0) {
whour += 1;
hour+=1;
}
if (date2Time % bl != 0) {
bhour += 1;
hour+=1;
}
}
System.out.println("总天数:" + day);
System.out.println("总小时数:" + hour + "\n");
System.out.println("白天小时数:" + whour);
System.out.println("黑夜小时数:" + bhour + "\n");
System.out.println("白天次数:" + wcs);
System.out.println("夜晚次数:" + bcs);
}
}
总结
到此这篇关于如何用java计算两个时间相差多少小时的文章就介绍到这了,更多相关java计算时间相差小时内容请搜索软件开发网以前的文章或继续浏览下面的相关文章希望大家以后多多支持软件开发网!