我们可以看到,Calendar 中的构造方法被封装在包中,我们无法直接通过构造方法来创建一个新的实例对象,我们只能通过调用 Calendar中的静态方法 Calendar.getInstance()方法获取一个实例对象。
我们看一下官方API 中提供了哪些方法获取Calendar 对象:
这是官方文档给出的获取去对象实例的方法,我们可以看到,我们可以通过指定TimeZone 和 Locale 来获取特定的 Calendar 对象,这也却分了每个地区的时间日历,方便开发者使用
除了通过getInstance() 方法获取实例以外,Java 1.8 提供了一个内部类:
我们可以通过创建一个Builder 的实体,然后通过调用Build 方法获取一个 Calendar 实例。
在Builder 中,Builder 类提供了设置年月日的方法,可以通过设置时间,来获取特定的Calendar 对象。
Calendar.Builder builder =new Calendar.Builder(); Calendar calendar1 = builder.build(); Date date = calendar.getTime();
这里总结一下:
Calendar 提供的获取实例的方法主要有两种途径:
1、调用Calendar.getInstance()方法
2、创建内部类Builder 的实例,通过调用其 build()方法创建 Calendar 实例
对于第一种方法,只能先获取当前时间的Calendar,然后再通过调用相应的set 方法设置年月日等,而如果使用内部类Builder 方法,可以通过setInstant 方法设置我们所期望的时间。
2.2 Calendar 的常用方法
我们最常用的方法有:
Calendar calendar = Calendar.getInstance(); Date date = calendar.getTime();
通过Calendar 方法获取一个Date 的实例。
Calendar 方法获取年月日的方法:
int year =calendar.get(Calendar.YEAR); int month=calendar.get(Calendar.MONTH)+1; int day =calendar.get(Calendar.DAY_OF_MONTH); int hour =calendar.get(Calendar.HOUR_OF_DAY); int minute =calendar.get(Calendar.MINUTE); int seconds =calendar.get(Calendar.SECOND);
我们可以看到Calendar 里面获取年月日不像上面 Date 类中的通过访问各个方法来获取。
Calendar 在初始化的时候,就已经��年月日划分好,并且存入fields 变量中。我们只需要传入每个位置编号,就可以获取我们需要的信息
除了获取以外,Calendar 也提供了相应的set 方法:
通过重新传入参数,设置Calendar 的时间
Calendar 获取当前月份,当前星期的最大\小天数
System.out.println(calendar.getActualMaximum(Calendar.DAY_OF_WEEK)); System.out.println(calendar.getActualMaximum(Calendar.DAY_OF_MONTH)); System.out.println(calendar.getActualMinimum(Calendar.DAY_OF_WEEK)); System.out.println(calendar.getActualMinimum(Calendar.DAY_OF_MONTH));
提供了Before 和After 两个方法,用于判断当前时间与对比时间先后:
提供了add 方法进行日期的加减
calendar.add(10,10);
2.3 Calendar 的总结
从上面的分析我们可以看到,Calendar 类 主要是用于作为日历的对象,可以铜鼓哦设置地区时间,区分每个地区的日期,Calendar 提供的方法也没有很多对时间进行的一些操作。
3、LocalDate/LocalTime 类Java 8新增了LocalDate和LocalTime接口,为什么要搞一套全新的处理日期和时间的API?因为旧的java.util.Date实在是太难用了。
java.util.Date月份从0开始,一月是0,十二月是11,变态吧!java.time.LocalDate月份和星期都改成了enum,就不可能再用错了。