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小时制。

你可能感兴趣的:(java笔记)