網上有很多比較日期的方法,很多都用到了SimpleDateFormat
進行格式化,如果只是比較大小不進行顯示,沒有必要格式化。如果日期比較要包含時分秒,那可以直接用Date
或者calendar
的before或者after方法。很多時候要不包括時間部分,只是比較年月日,就可以用calendar去設置自己想要的時間格式,用SimpleDateFormat
去除時分秒轉來轉去很麻煩。可以用calendar
的set
方法,將時分秒統一置爲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類型的,直接比較大小就可以,並且before
和after
方法源碼也是比較的毫秒值。
另外,Calendar.HOUR_OF_DAY
和Calendar.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
不同的HOUR
和HOUR_OF_DAY
,得到的時間小時制不同。但對於SimpleDateFormat
格式化輸出後都是一樣的,至於格式化輸出24小時制還是12小時制,HH:mm:ss
是24小時制,hh:mm:ss
是12小時制。
補充:
以上的例子是在上午測試的,我在中午過了12點之後也就是下午,我再次測試,終於發現set
不同的HOUR
和HOUR_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小時制。