Calendar日历类的使用
首先我们要知道日历类是一个抽象类
那么既然是一个抽象类,我们肯定是要通过创建其子类的对象了实现这个抽象类中的一些方法
日历类(Calender类)的实例化:
方式一:
我们直接创建其子类的对象 (也就是创建一个GregorianCalendar类的对象)
java中提供了Calender类的一个子类:GregorianCalendar
方式二:
我们也可以通过调用Calendar类中的getInstance()静态方法
我们通过调用Calendar类中的getInstance()静态方法就可以的得到一个GregorianCalendar类的对象
我们的getInstance()方法返回值类型为GregorianCalendar
这里我们如果使用方式二创建这个子类对象,那么这个时候我们可以选择使用多态的语法:
Calendar cn = Calendar.getInstance();//这里我们使用父类的引用指向了子类的对象
1
我们使用多态可以降低代码的耦合性(并且我们也可应直接使用子类重写的父类的方法)
那么我们如何知道Calendar.getInstance()方法是返回了GregorianCalendar类的对象?
我们可以通过使用我们getInstance()方法调用一个getClass()方法,然后我们在对这个方法的返回值进行输出
getClass();返回当前创建当前对象创建类的全类名:
如:我们这里就是返回:class java.util.GregorianCalendar
通过这种方式的输出我们就可以发现Calendar类的getInstance()方法时返回了一个GregorianCalendar类的对象
可以说我们的方式二(也就是getInstance()方法),就是担心如果我们记不住方式一:(也就是记不住Calendar类的子类:GregorianCalendar类)
常用成员方法:
public int get();
获取我们一些常用的属性
eg: int days = cn.get(Calender.DAY_OF_MONTH);
我们调用这个方法的返回值就是这个cn对象所代表的日期是这个月的第几天
DAY_OF_MONTH是我们Calendar类中的一个静态常量,
public void set(int field,int value);
修改(设置)我们一些常用的属性
这个形参field就是我们想要修改的日历字段
这里的value就是我们用来替换的值
这个方法是没有返回值的,这个方法就是在原本对象上进行了改变
public void add(int field,int amount);
给我们的日历字段进行增加一个指定的时间量(这里我们的这个指定的时间量可以是负数,就相当于减,也就是加了一个负数)
我们通过这里amount变量的正负来控制是减还是加
这里的形参field就是我们想要修改的日历字段
这里的amount就是我们要增加或者减去的时间量
如果是减的话就是这里的时间量是一个负数
getTime();
将日历类------>Date;
这个方法是无参的
这个方法的返回值是Date类型的
这个方法中输入的形式参数为
getTimeInMillis()
将日历类转化成了时间戳
(但是我们可以再使用Date的构造方法将这个时间戳再转换为一个Date类型的对象)
这个方法是无参的
我们的get()方法一般都是无参的
我们的这个方法返回的是一个long类型的数据
setTime(Date date);
将Date----->日历类;
这里其实就是传入了一个Date对象,这个时候底层是调用了setTimeMillis()方法,设置了我们的Calendar对象中的时间,这个时候我们的这个Calendar对象对应的时间就变成了这个Date对象对应的时间
这个时候我们也就说是将我们的Date对象转换成了一个Calendar
其实只是将我们的Calendar对象对应的时间修改成了和Date对象对应的时间相同的
在使用Calendar类获取月份时:一月是0,二月是1,三月是2…十二月是11
在我们使用Calendar类获取星期时:周日是1,周一是2,周二是3
Calendar类的缺点:(所以后面又产生了java.time包)
可变性(Calendar类是可变的)
一般我们的日期时间对象一旦创建之后就不应该再进行修改,如果我们要修改就去创建一个新的对象(也就是类似于String一样具有不可变性)
不可以格式化(我们的Calendar类是不可以进行格式化的)
线程不安全
我们的Calender是线程不安全的,无法处理我们的闰秒的问题等
闰秒:当我们的世界时(民用时)和原子时相差±0.9秒时,我们就要把世界时(民用时)向前拨一秒 (负闰秒),或者向后拨一秒(正闰秒)
目前全球进行了27次闰秒(都是正闰秒)
我们可以发现我们讲过的jdk1.8之前的时间日期类使用起来都是很麻烦的,要创建一个指定日期的对象就更加麻烦,所以我们jdk1.8之前对时间日期类的操作是我们的程序员的一个很头疼的问题
注意:我们的时间日期类中有很多时候我们传入的参数都是long类型,要注意在整形的字面量后面加L