Calendar特性及需要注意的几个点

Calendar类需要注意的以下几点:

1. add与roll的区别

add(int field,int amount)方法主要用于改变Calendar的特定字段的值。如果要增加某个字段的值,则amount为正数,如果要减少某个字段的值,则amount为负数。此方法有如下两条规则:

1)当被修改的字段超出它允许的范围时,会发生进位,即上一级字段也会增大。例如:

Calendar cal = Calendar.getInstance();

cal.set(2008,7,23,0,0,0);//2008-8-23

cal.add(Calendar.MONTH,6);//2008-8-23 =>2009-2-23

2) 如果下一级字段也需要改变,则该字段会修正到变化最小的值。例如:

Calendar cal = Calendar.getInstance();

cal.set(2008,7,31,0,0,0);//2008-8-31

//因为进位后月份变为2,而2月没有31日,自动变成28

cal.add(Calendar.MONTH,6);//2008-8-31 =>2009-2-28

roll()的规则与add()规则处理不同:当被修改的字段超出它允许的范围时,上一级字段也不会增大,即不会发生进位。例如:

Calendar cal = Calendar.getInstance();

cal.set(2008,7,23,0,0,0);//2008-8-23

cal.add(Calendar.MONTH,6);//2008-8-23 =>2008-2-23

roll()下一级字段的处理与add()相同,都会修正到该字段变化的最小值,例如:

Calendar cal = Calendar.getInstance();

cal.set(2008,7,31,0,0,0);//2008-8-31

//2月没有31日,自动变成29,YEAR字段不会改变

cal.add(Calendar.MONTH,6);//2008-8-31 =>2008-2-29

 2. 设置Calendar的容错性

先看如下代码:

Calendar cal = Calendar.getInstance();
System.out.println("现在时间:"+cal.getTime());
cal.set(Calendar.MONTH, 13);//(1)
System.out.println("月份加上13后的时间"+cal.getTime());
//关闭容错性
cal.setLenient(false);
cal.set(Calendar.MONTH, 13);//(2)
System.out.println(cal.getTime());

打印结果为:

现在时间:Sat Feb 23 22:06:13 CST 2019
月份加上13后的时间Sun Feb 23 22:06:13 CST 2020
Exception in thread "main" 
java.lang.IllegalArgumentException: MONTH

从打印结果可以看出:月份加上13后,代码能正常执行,YEAR字段加1,MONTH字段为1即2月,但是加上cal.setLenient(false);这行代码后,代码运行时异常,因为月份超出了最大月份。Calendar默认支持较好的容错性,可以关闭其容错性,让它进行严格的参数检查。

3. set()方法延迟修改

通过set()方法设置某一个字段的值得时候,该字段的值不会立马修改,直到下次调用get()、getTime()等时才会重新计算日历的时间。延迟修改的优势是多次调用set()方法不会触发多次不必要的计算。下面程序演示了set()方法延迟修改的效果:

Calendar cal = Calendar.getInstance();
cal.set(2003,7,31);//2003-8-31
//将月份设为9,但9月31不存在
//如果立即修改,系统会把cal自动调整到10月1日
cal.set(Calendar.MONTH,8);
//下面代码输出了10月1日
System.out.println(cal.getTime());//(1)
//设置DATE字段为5
cal.set(Calendar.DATE, 5);//(2)
System.out.println(cal.getTime());//(3)

打印结果为:

      Wed Oct 01 22:25:41 CST 2003
      Sun Oct 05 22:25:41 CST 2003

如果将(1)处的代码注释掉,打印结果为:

Fri Sep 05 22:28:06 CST 2003

你看明白了吗?如果将(1)处的代码注释掉,因为set()方法具有延迟性,它内部只是先记录下MONTH字段的值为8,接着程序将DATE字段设置为5,程序内部再次记录DATE字段的值为5——就是9月5日。

欢迎关注微信公众号【Java典籍】

收看更多Java技术干货!

 ▼长按下图↓↓↓二维码识别关注

如果觉得本文对您有用,请点击好看

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值