网上有很多比较日期的方法,很多都用到了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小时制。