设置Calendar的容错性
调用Calendar对象的set()方法改变指定时间字段的值时,有可能传入一个不合法的参数,例如:为MONTH字段设置13,这将会导致什么结果呢?
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd:hh:mm:ss");
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.MONTH, 13); // ①
System.out.println(simpleDateFormat.format(calendar.getTime()));
// 关闭容错性
// calendar.setLenient(false);
calendar.set(Calendar.MONTH, 13); // ②
System.out.println(simpleDateFormat.format(calendar.getTime()));
打印结果如下:
![](https://img.haomeiwen.com/i1623397/41737fec37539e4c.png)
当打开calendar.setLenient(false)时,①处代码可以正常运行,因为将MONTH字段设置为13,将会导致YEAR字段加1;②处将会导致运行异常,因为设置的MONTH字段超出了所允许的范围。关键在于程序中粗体字代码行,Calendar提供一个setLenient用于设置它的容错性,Calendar默认支持比较好的容错性,通过setLenient(false)了一关闭Calendar的容错性,让它进行严格的参数检查。
Calendar有两种解释日历字段的模式:lenient模式和non-lenient模式。当处于lenient模式时,每个字段都可接受超出范围的值。当处于non-lenient模式时,每个字段都进行严格的参数检查,不接收超出字段的值。
set()方法延迟修改
set(f,value)方法日历的某个字段修改为value值,此外它还设置了一个内部成员变量,以指示日历字段f已经被更改。尽管日历字段f是立即更改的,但该Calendar所代表的事件却不会立即修改,直到下次调用get()、getTime()、getTimeInMillis()、add()或roll()时才会重新计算日历的时间。这杯称为set()方法的延迟修改,采用延迟修改的优势是多次调用set()不会触发多次不必要的运算,下面来看一个例子:
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd:hh:mm:ss");
Calendar calendar = Calendar.getInstance();
calendar.set(2003, 7, 31);
calendar.set(Calendar.MONTH, 8);
// System.out.println(simpleDateFormat.format(calendar.getTime())); // ①
calendar.set(Calendar.DATE, 5);
System.out.println(simpleDateFormat.format(calendar.getTime()));
当①被注释掉时,打印结果如下:
![](https://img.haomeiwen.com/i1623397/088c489be0f91f2e.png)
打开①处的注释,打印结果如下:
![](https://img.haomeiwen.com/i1623397/dc0e73394740a7e4.png)
网友评论