<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
最近有個需求,根據兩個時間,計算兩個時間之間相差多少個小時。
查了一下,網上有現成的工具類
摘出自己需要的。得到下面這個
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計算時間相差小時內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45