美文网首页
Java Calendar类的使用注意事项

Java Calendar类的使用注意事项

作者: zivxia | 来源:发表于2018-03-11 08:07 被阅读376次

设置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()));

打印结果如下:


image.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()));

当①被注释掉时,打印结果如下:


image.png

打开①处的注释,打印结果如下:


image.png

相关文章

网友评论

      本文标题:Java Calendar类的使用注意事项

      本文链接:https://www.haomeiwen.com/subject/qgeifftx.html