java.util.Calendar类的功能要比java.util.Date类的功能强大很多。Calendar类是一个抽象类,它为特定毫秒值与一组诸如年、月、日、时、分、秒等日历字段之间的转换,以及为操作日历字段提供一些方法。Calendar类的特定毫秒值和Date类一样,都是距离基准时间1970年1月1日00:00:00.00的偏移量。
Calendar抽象类通过调用静态方法getInstance来获得此类型的一个通用的对象。Calendar类的getInstance方法返回一个Calendar子类对象,其日历字段已由当前日期和时间初始化。例如:语句“Calendar right Now=Calendar.getInstance();”,查看源代码,right Now变量指向的是一个新建的GregorianCalendar对象。GregorianCalendar类是Calendar抽象类的子类。
Calendar类中有一些常量,常见指示get和set的日历字段值如表8-2所示。
表8-2 Calendar类中的部分get和set的日历字段值
Calendar类的常用方法,说明如下:
(1)public static Calendar getInstance():使用默认时区和默认语言环境获得基于当前时间的一个Calendar日历对象。
(2)public final Date get Time():返回一个表示此Calendar时间值(从历元至现在的毫秒偏移量)的Date对象。
(3)public final void set Time(Date date):使用给定的Date设置此Calendar的时间。
(4)public int get(int field):返回给定日历字段的值。
(5)public void set(int field,int value):将给定的日历字段设置为给定值。
(6)public final void set(int year,int month,int date):设置日历字段YEAR、MONTH和DAY_OF_MONTH的值。保留其他日历字段以前的值。如果不需要这样做,则先调用clear()。
(7)public final void set(int year,int month,int date,int hour OfDay,int minute):设置日历字段YEAR、MONTH、DAY_OF_MONTH、HOUR_OF_DAY和MINUTE的值。保留其他字段以前的值。如果不需要这样做,则先调用clear()。
(8)public final void set(int year,int month,int date,int hour OfDay,int minute,int second):设置字段YEAR、MONTH、DAY_OF_MONTH、HOUR、MINUTE和SECOND的值。保留其他字段以前的值。如果不需要这样做,则先调用clear()。
(9)public abstract void add(int field,int amount):根据日历的规则,为给定的日历字段添加或减去指定的时间量。例如,要从当前日历时间减去5天,可以通过调用以下方法做到这一点:add(Calendar.DAY_OF_MONTH,-5)。
【例8-2】
获取系统当前时间的Calendar对象,并获取日历字段信息。
Calendar变量所引用的子类对象封装了所有的日历字段值,通过get方法可以获取不同日历字段的取值。测试类Calendar Test1演示了如何获取当前日历字段信息,如图8-2所示。
图8-2 获取日历各字段信息(www.xing528.com)
(1)程序第6行创建了一个系统当前时间的Calendar对象,Calendar类在静态方法getInstance中创建了一个子类对象,父类引用指向子类对象,是多态的应用。第6行的效果和第7行的效果相同。
(2)程序第8行通过Calendar类的get Time方法将Calendar变量所引用的子类对象转换为对应的Date对象。
(3)程序第10行c1.get(Calendar.YEAR)等价于c1.get(1)。使用常量表示,提高程序的可读性。
(4)注意程序第11行c1.get(Calendar.MONTH)得到的值比现实中说的月份数少1。
(5)注意程序第18行Calendar对象c1通过get方法取回的Calendar.DAY_OF_WEEK的取值范围为1~7,依次对应周日,周一,…,周六。
【例8-3】
设置Calendar日历对象。
设置日历对象测试类Calendar Test2,如图8-3所示。
图8-3 设置日历
(1)创建一个指定日期的Calendar对象,需要首先创建一个Calendar对象,然后再按需设定该对象的年月日等日历字段。
(2)Calendar对象除了调用set方法来设置各日历字段值外,还可以使用给定的Date对象调用方法set Time(Date date)设置此Calendar对象的时间。
【例8-4】
从现在时间往前推102天是哪年哪月哪日,星期几?
测试类Calendar Test3如图8-4所示。
图8-4 日历推算
(1)Calendar类public abstract void add(int field,int amount)是抽象方法,子类需要重写。amount的符号决定向前推还是向后推。
(2)注意星期几和几月的处理。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。