一:因为Date类在设计上有一些缺陷,所以Java提供了Calendar类来更好的处理日期
和时间Calendar是一个抽象类,他用于表示日历

  

//创建一个默认的Calendar对象
        Calendar calendar = Calendar.getInstance();
        System.out.println(calendar);
        //下面是输出语句 里面包含了很多时间类型
        //java.util.GregorianCalendar
[time=1610763708742,areFieldsSet=true,areAllFieldsSet=true,
        // lenient=true,zone=sun.util.calendar.ZoneInfo
[id="Asia/Shanghai",offset=28800000,
        //
dstSavings=0,useDaylight=false,transitions=19,lastRule=null],firstDayOf
Week=1,
        //
minimalDaysInFirstWeek=1,ERA=1,YEAR=2021,MONTH=0,WEEK_OF_YEAR=3,WEEK_OF
_MONTH=3,
        //
DAY_OF_MONTH=16,DAY_OF_YEAR=16,DAY_OF_WEEK=7,DAY_OF_WEEK_IN_MONTH=3,AM_
PM=0,
        //
HOUR=10,HOUR_OF_DAY=10,MINUTE=21,SECOND=48,MILLISECOND=742,ZONE_OFFSET=
28800000,
        // DST_OFFSET=0]

二:取出年月日

 

Calendar calendar = Calendar.getInstance();
        //calendar.get(Calendar.MONTH)这个方法默认获取的是0-11月 使用的时
候加一就行
        System.out.println(calendar.get
(Calendar.YEAR)+"-"+calendar.get(Calendar.MONTH)+1+"-"+calendar.get
(Calendar.DATE));

三.获取自己设置的时间
 

Calendar calendar = Calendar.getInstance();
       calendar.set(2021,10,11);
        System.out.println(calendar.get(Calendar.YEAR));
        System.out.println(calendar.get(Calendar.MONTH));
        System.out.println(calendar.get(Calendar.DATE));

四.时间的增加和减少

 

Calendar calendar = Calendar.getInstance();
       calendar.set(2021,10,11);
       //将年向前推一年  整数是加  负数时减
       calendar.add(Calendar.YEAR,-1);
        System.out.println(calendar.get(Calendar.YEAR));
        //将月份向前 退8个月
        calendar.roll(Calendar.MONTH,-8);
        System.out.println(calendar.get(Calendar.MONTH));

五.上面可以看出来 add 和roll 都可以增加和删除时间 下面写一下他们的区别

 
1.add的规则

Calendar ca = Calendar.getInstance();
      ca.set(2003,7,23,0,0,0);
      ca.add(Calendar.MONTH,6);
      //显示的年数为2004年 add添加的时候 当他所修改的日期超出他本身的范围的
时候 他的上一级会增加一 可以把它理解为一种
        //年为12进制 月为30或31进制   (超出指定范围后 连带着前面都会发生变
化)
        System.out.println(ca.get(Calendar.YEAR));//输出2004
        System.out.println(ca.get(Calendar.MONTH));//输出1月

2. roll 规则

Calendar ca = Calendar.getInstance();
      ca.set(2003,7,23,0,0,0);
     ca.roll(Calendar.MONTH,6);
     //roll 当它所添加的元素 超越本身的范围时 他的上一级不会发生变化 下一级
和add用法相似
        System.out.println(ca.get(Calendar.YEAR));//输出2003
        System.out.println(ca.get(Calendar.MONTH));//输出1

 

六:calendar 的容错性

 

默认的话 当你设置的月份 或者年份查出原先设定的话 他会在原基础上 的上一级加一
月份也会随着改变  当你把容错性关闭的话 他会报错(例如我们填写一个时间的列表的
时候 在月份填了13个月 那么他的年份会加1 月份显示1月)

Calendar ca = Calendar.getInstance();
    ca.set(Calendar.MONTH,13);
      //这里输出2022年 因为我本机的时间为2021年
        System.out.println(ca.getTime());
        ca.setLenient(false);
        ca.set(Calendar.MONTH,13);
        System.out.println(ca.getTime());

 

七:set方法的延迟修改

使用Set方法的时候他有延迟的特性 ,同时两次调用Set的时候 后一次调用也是在原基
础上
例如:

 

Calendar ca = Calendar.getInstance();
        ca.set(2003, 7, 31);
        ca.set(Calendar.MONTH, 8);
        //System.out.println(ca.getTime());
         ca.set(Calendar.DATE,5);
        System.out.println(ca.getTime());

设置时间为2003-7-31 然后修改月为8月之后输出显示 2003-10-1 (因为9月没有31天
只修改的月的话 就会变为10月1  )然后在设置时间为5 最后输出是 10-5  假设把上
面的输出注释掉 就会显示9-5 所以 Set具有延迟的特性

 

八:Java8 新增的日期。时间包

1.clock,该类用于获取指定时区的当前时间、该类可取代System类
currentTimeMills()方法,提供更多的方法俩获取当前日期时间。

clock的用法 

 

//获取当前的clock
        Clock clock = Clock.systemUTC();
        //输出当前时间  2021-01-17T10:57:06.247663700Z
        System.out.println(clock.instant());
        //获取clock对应的毫秒数,与System。currentTimeMillis ()输出相同
        System.out.println(clock.millis());
        System.out.println(System.currentTimeMillis());

2.Instant的用法

 

//获取当前时间
        Instant instant = Instant.now();
        //2021-01-17T11:13:01.510301600Z
        System.out.println(instant);

3.LocalDate的用法

 

LocalDate localDate = LocalDate.now();
        //输出 2021-01-17
        System.out.println(localDate);
        //获取2021年第153天
        localDate = LocalDate.ofYearDay(2021, 153);
        //输出 2021-06-02
        System.out.println(localDate);

4LocalTime的用法

LocalTime localTime = LocalTime.now();
        //设置时间22点33分
        localTime = LocalTime.of(22,33);
        //输出22:33
        System.out.println(localTime);

5LocalDateTime的用法

//LocalDateTime 获取当前日期时间
        LocalDateTime localDateTime = LocalDateTime.now();
        //输出2021-01-17T20:42:02.069759600
        System.out.println(localDateTime);
//为当前时间 加上22小时 33分钟
        LocalDateTime a = localDateTime.plusHours(22).plusMinutes(33);
        //输出2021-01-18T19:22:33.660589100
        System.out.println(a);

6 Year yearMonth MonthDay 的用法

 

 

Year year = Year.now();
        System.out.println(year);
        //当前年份 加5年
        Year year1 = year.plusYears(5);
        //输出2026
        System.out.println(year1);
        //获取 指定年的月份
        YearMonth yearMonth = year.atMonth(10);
        //输出2021-10
        System.out.println(yearMonth);
        //当前年份 加5年减3个月
        yearMonth = yearMonth.plusYears(5).minusMonths(3);
        //输出2026-07
        System.out.println(yearMonth);
        //设置指定月天
        MonthDay monthDay = MonthDay.now();
        MonthDay monthDay1 =monthDay.with(Month.MAY).withDayOfMonth
(23);
        //输出--05-23
        System.out.println(monthDay1);