java中比較日期大小,Calendar設置時分秒,HOUR和HOUR_OF_DAY的區別

網上有很多比較日期的方法,很多都用到了SimpleDateFormat進行格式化,如果只是比較大小不進行顯示,沒有必要格式化。如果日期比較要包含時分秒,那可以直接用Date或者calendar的before或者after方法。很多時候要不包括時間部分,只是比較年月日,就可以用calendar去設置自己想要的時間格式,用SimpleDateFormat 去除時分秒轉來轉去很麻煩。可以用calendarset方法,將時分秒統一置爲0。

注意,獲取get(Calendar.MONTH)月份的時候要+1,因爲月份從0開始算的。

Calendar calendar = Calendar.getInstance();
 //將時分秒置0
 calendar.set(Calendar.HOUR_OF_DAY, 0);
 calendar.set(Calendar.MINUTE, 0);
 calendar.set(Calendar.SECOND, 0);
 calendar.set(Calendar.MILLISECOND, 0);
 Date curTime = calendar.getTime();
 calendar.add(Calendar.DATE, -1);
 Date termTime = calendar.getTime();
 SimpleDateFormat format = new SimpleDateFormat("YYYY-MM-dd HH:mm:ss.SSS a");
 System.out.println("當前:"+curTime);
 System.out.println("當前:"+format.format(curTime));
 System.out.println("到期日:"+termTime);
 System.out.println("到期日:"+format.format(termTime));
 System.out.println(curTime.after(termTime));
輸出:
當前:Tue Apr 09 00:00:00 CST 2019
當前:2019-04-09 00:00:00.000 上午
到期日:Mon Apr 08 00:00:00 CST 2019
到期日:2019-04-08 00:00:00.000 上午
true

除了用before或者after方法外,也可以直接calendar.getTimeInMillis()獲取毫秒值進行比較,是long類型的,直接比較大小就可以,並且beforeafter方法源碼也是比較的毫秒值。

另外,Calendar.HOUR_OF_DAYCalendar.HOUR 前者是24小時制,後者是12小時制,在用get的時候會區分出24和12小時制。

Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 13);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
Date curTime = calendar.getTime();
SimpleDateFormat format = new SimpleDateFormat("YYYY-MM-dd HH:mm:ss.SSS a");
System.out.println("當前1:"+curTime);
System.out.println("當前1:"+format.format(curTime));
System.out.println(calendar.get(Calendar.HOUR_OF_DAY));
System.out.println(calendar.get(Calendar.HOUR));
輸出:
當前1:Tue Apr 09 13:00:00 CST 2019
當前1:2019-04-09 13:00:00.000 下午
13
1
======================================
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR, 13);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
Date curTime = calendar.getTime();
SimpleDateFormat format = new SimpleDateFormat("YYYY-MM-dd HH:mm:ss.SSS a");
System.out.println("當前1:"+curTime);
System.out.println("當前1:"+format.format(curTime));
System.out.println(calendar.get(Calendar.HOUR_OF_DAY));
System.out.println(calendar.get(Calendar.HOUR));
輸出:
當前1:Tue Apr 09 13:00:00 CST 2019
當前1:2019-04-09 13:00:00.000 下午
13
1

網上有人說set不同的HOURHOUR_OF_DAY,得到的時間小時制不同。但對於SimpleDateFormat格式化輸出後都是一樣的,至於格式化輸出24小時制還是12小時制,HH:mm:ss是24小時制,hh:mm:ss是12小時制。
補充:
以上的例子是在上午測試的,我在中午過了12點之後也就是下午,我再次測試,終於發現set不同的HOURHOUR_OF_DAY的區別了。

Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR, 1);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
Date curTime = calendar.getTime();
SimpleDateFormat format = new SimpleDateFormat("YYYY-MM-dd HH:mm:ss.SSS a");
System.out.println("當前1:"+curTime);
System.out.println("當前1:"+format.format(curTime));
System.out.println(calendar.get(Calendar.HOUR_OF_DAY));
System.out.println(calendar.get(Calendar.HOUR));
輸出:
當前1:Tue Apr 09 13:00:00 CST 2019
當前1:2019-04-09 13:00:00.000 下午
13
1
=======================================
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 1);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
Date curTime = calendar.getTime();
SimpleDateFormat format = new SimpleDateFormat("YYYY-MM-dd HH:mm:ss.SSS a");
System.out.println("當前1:"+curTime);
System.out.println("當前1:"+format.format(curTime));
System.out.println(calendar.get(Calendar.HOUR_OF_DAY));
System.out.println(calendar.get(Calendar.HOUR));
輸出:
當前1:Tue Apr 09 01:00:00 CST 2019
當前1:2019-04-09 01:00:00.000 上午
1
1

可以看出,在設置Calendar.HOUR的時候,calendar是根據當前執行代碼時的系統時間去設置小時的,也就是根據當前時間的上午還是下午,我也就明白了源碼中爲什麼說Calendar.HOUR的範圍是0-11了。至於HOUR_OF_DAY就沒有問題了,根據24小時制。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章