Java Calendar.set 方法設置時間的問題


因項目需要,需要遍歷一年中的其中幾個月,獲得每個月的用戶數量。  變量有:開始時間--startDate,結束時間--endDate。

邏輯很簡單:獲取到開始時間的月份和結束時間的月份,然后得到月份差值,進行for循環遍歷,遍歷的時候判斷用戶注冊的時間是否在這個月里,然后得出結果。

關鍵就在於:判斷用戶注冊的時間是否在這個月里。

想了一個辦法:假如一個用戶的注冊時間是 2016-09-05 22:05 ,那么判斷這個用戶的 注冊時間是否小於 [2016-09-30 23:59] 就可以了。

好了,邏輯清楚了,問題來了:怎么獲取每個月份的最大時間(每個月的最后一天、最后一小時、最后一分鍾、最后一秒)呢?

查了查Java的api 發現官方推薦使用 java.util.Calendar; java.util.Date; 里面的很多方法都已經不被推薦使用了。 比如:Date.getDate(); 

Calendar很好用 采用的是單例模式,通過:Calendar.getInstance();獲取他的實例。使用Calendar.setTime(Date date);設置時間 。

代碼:

1 //獲取實例
2 Calendar calendarInstance = Calendar.getInstance();
3 //設置時間
4 calendarInstance.setTime(startTime);

好了重點來了,假如當前Calendar實例的時間是:2016-09-05 22:05 ,則變化到最大的時間為:2016-09-30 23:59 

看代碼:

1 //設置每月的最大天數
2 calendarInstance.set(Calendar.DAY_OF_MONTH, calendarInstance.getActualMaximum(Calendar.DAY_OF_MONTH));
3 //設置每天的最大小時
4 calendarInstance.set(Calendar.HOUR_OF_DAY, calendarInstance.getActualMaximum(Calendar.HOUR_OF_DAY));
5 //設置每小時最大分鍾
6 calendarInstance.set(Calendar.MINUTE, calendarInstance.getActualMaximum(Calendar.MINUTE));
7 //設置每分鍾最大秒
8 calendarInstance.set(Calendar.SECOND, calendarInstance.getActualMaximum(Calendar.SECOND));

Calendar 的set方法可以設置時間中的值比如:

Calendar.SECOND  秒
Calendar.MINUTE  分鍾
等等

Calendar 的getActualMaximum方法可以得到單位時間的最大值。比如:每月最多有幾天,每天最多幾個小時等等

這樣就得到了已知時間在單位時間(每個月)內的最大值。同理單位時間為每天的話,類似的道理。

 

這還沒完呢。

整個程序里只有兩個變量,開始和結束的時間,中間的時候需要手動加。

2016-09-05 22:05 的下個月的最大時間應該是:2016-10-31 23:59  

我一開始用的方法是:

calendarInstance.set(Calendar.MONTH, calendarInstance.get(Calendar.MONTH) + 1 );

發現bug,當開始時間的月份有31天的話,這樣得出的結果就是下下個月 比如:開始時間--2016-05-31 23:59  轉換后的時間是--2016-07-01 23:59 

怎么會多一個月?

想來想去猜測是這個原因:5月有31天。而6月只有30天 如果直接使用 set方法設置月份的話,就得到 6月31號 但是6月沒有31號於是 Calendar 自動進位,就變成了 7月01號。

解決辦法是:使用Calendar.add(int field, int amount); 第一個參數是 字段(月份,天,小時..),第二個參數是 增量。

 

這樣就可以直接從 5月31號 變成6月30號了。

 

歡迎加入 java開發群:497036534。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM