JavaSE03_Day02(中)-Calendar日历类(getInstance、get、getActualMaxmum、getActualMinmum、set、add方法)

一、作业讲解

需求

  用户在控制台中输入自己的出生年月日,格式为yyyy-MM-dd,计算输出当前总共活了多少天?还需要计算出生10000天以后的时间,该时间格式仍然和上面保持一致。

 package cn.tedu.date;
 
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.Date;
 import java.util.Scanner;
 
 /**
  * 作业讲解案例
  * @author cjn
  *
  */
 public class HW {
 
     public static void main(String[] args) {
         Scanner scanner = null;
         try {
             scanner = new Scanner(System.in);
             System.out.println("请输入您的生日:格式为2021-7-29");
             String birthdayStr = scanner.nextLine();
             //将接收到的字符内容需要进行解析为Date日期对象
             SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
             //生日对应的Date对象
             Date birthday = sdf.parse(birthdayStr);
             //获取当前的Date对象
             Date now = new Date();
             //获取当前活着的时间偏移量(毫秒值)
             long lifeTime = now.getTime() - birthday.getTime();
             //将活着的时间偏移量毫秒值->天数
             lifeTime = lifeTime/1000/60/60/24;
             System.out.println("恭喜您一共出生了" + lifeTime + "天");
             System.out.println("--------------------------------------");
             //获取生日的时间偏移量
             long time = birthday.getTime();
             //根据生日的时间偏移量计算10000天以后的时间,此处注意int溢出,要转化为long类型
             time = time + 10000L * 24 * 60 *60 * 1000;
             Date date = new Date(time);
             //对于出生10000天以后的时间做一个格式化处理
             String str = sdf.format(date);
             System.out.println("您出生10000天以后的纪念日为:" + str );            
        } catch (ParseException e) {
             e.printStackTrace();
        } finally {
             scanner.close();//关闭资源
        }
    }
 
 }

测试结果:

 请输入您的生日:格式为2021-7-29
 2008-8-8
 恭喜您一共出生了4738天
 --------------------------------------
 您出生10000天以后的纪念日为:2035-12-25

 

二、Calendar日历类

2.0 概述

  Calendar是来自于java.util包下的抽象类,该类主要用于封装日历的信息,内部提供了很多的API方法,可以对时间进行计算,该类对应的实现类中应用最为广泛的是GregorianCalendar格里高利历,也就是通用的阳历。根据不同国家的日历系统提供的相关内容。

2.1 getInstance()方法

  Calendar日历类中提供了一个静态方法getInstance()方法,该方法可以根据当前系统所在的地区返回一个合适的日历实现类,但是大部分地区返回的日历的实现类都是GregorianCalendar。

 package cn.tedu.date;
 
 import java.util.Calendar;
 import java.util.Date;
 
 /**
  * 日历类的实例化使用案例
  * @author cjn
  *
  */
 public class CalendarDemo01 {
 
     public static void main(String[] args) {
         //1.获取日历对象
         Calendar calendar = Calendar.getInstance();
         //System.out.println(calendar.getClass().getName());
         //由上面得到:java.util.GregorianCalendar
         System.out.println(calendar);
         
         /*
          * Calendar->Date
          * Date getTime()
          */
         Date date = calendar.getTime();
         System.out.println(date);
         
         /*
          * Date->Calendar
          * void setTime(Date date)
          */
         Date date2 = new Date();
         calendar.setTime(date2);
         System.out.println(calendar);
    }
 
 }

测试结果:

 java.util.GregorianCalendar[time=1627562345828,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2021,MONTH=6,WEEK_OF_YEAR=31,WEEK_OF_MONTH=5,DAY_OF_MONTH=29,DAY_OF_YEAR=210,DAY_OF_WEEK=5,DAY_OF_WEEK_IN_MONTH=5,AM_PM=1,HOUR=8,HOUR_OF_DAY=20,MINUTE=39,SECOND=5,MILLISECOND=828,ZONE_OFFSET=28800000,DST_OFFSET=0]
 Thu Jul 29 20:39:05 CST 2021
 java.util.GregorianCalendar[time=1627562345853,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2021,MONTH=6,WEEK_OF_YEAR=31,WEEK_OF_MONTH=5,DAY_OF_MONTH=29,DAY_OF_YEAR=210,DAY_OF_WEEK=5,DAY_OF_WEEK_IN_MONTH=5,AM_PM=1,HOUR=8,HOUR_OF_DAY=20,MINUTE=39,SECOND=5,MILLISECOND=853,ZONE_OFFSET=28800000,DST_OFFSET=0]

时间、日期、日历之间的转换关系:

 

2.2 调用get()方法获取时间分量

  Calendar日历类中提供了可以进行获取时间分量的get()方法,在该方法中可以根据参数的值,进行获取不同的分量,由于直接写固定的数值并不能让代码的可读性更加的直观,所以sun公司提供了相关的常量进行获取时间分量。

 package cn.tedu.date;
 
 import java.util.Calendar;
 
 /**
  * 有关于Calendar日历类的get方法案例演示
  * @author cjn
  *
  */
 public class CalendarDemo02 {
 
     public static void main(String[] args) {
         //创建日历对象
         Calendar calendar = Calendar.getInstance();
         //获取年份
         int year = calendar.get(Calendar.YEAR);
         System.out.println("年:" + year);
         
         /*
          * 获取月份
          * 规定月份是从0开始表示的
          * 0 表示 1月
          * 1 表示 2月
          * 2 表示 3月
          * 3 表示 4月
          * 4 表示 5月
          * ......
          */
         int month = calendar.get(Calendar.MONTH);
         System.out.println("月:" + (month+1));//月份要+1
         
         //获取日
         int day = calendar.get(Calendar.DATE);
         System.out.println("天:" + day);
         
         /*
          * 获取小时
          * Calendar.HOUR 12小时制
          * Calendar.HOUR_OF_DAY 24小时制
          */
         int hour = calendar.get(Calendar.HOUR_OF_DAY);
         System.out.println("小时:" + hour);
         
         //获取分钟
         int minute = calendar.get(Calendar.MINUTE);
         System.out.println("分钟:" + minute);
         
         //获取秒
         int seconds = calendar.get(Calendar.SECOND);
         System.out.println("秒:" + seconds);
         
         /*
          * DATE 月中的天
          * DAY_OF_MONTH 月中的天
          * DAY_OF_YEAR 年中的天
          * DAY_OF_WEEK 周中的天(国外周日排在周一的前面)
          */
         int date = calendar.get(Calendar.DAY_OF_YEAR);
         System.out.println("今天是2021年的第" + date + "天");
         date = calendar.get(Calendar.DAY_OF_MONTH);
         System.out.println("今天是7月份中的第" + date + "天");
         date = calendar.get(Calendar.DAY_OF_WEEK);
         System.out.println("今天是本周的第" + (date-1) + "天");
         
         //通过数组下表进行访问对应星期
         String[] weeks = {"日","一","二","三","四","五","六"};
         //                 0   1   2   3   4   5   6
         int week = calendar.get(Calendar.DAY_OF_WEEK) - 1;
         System.out.println("今天是星期" + weeks[week]);  
    }
 
 }

测试结果:

 年:2021
 月:7
 天:29
 小时:21
 分钟:36
 秒:37
 今天是2021年的第210天
 今天是7月份中的第29天
 今天是本周的第4天
 今天是星期四

2.3 getActualMaximum()方法

  该方法可以获取给定时间分量中所允许的最大值、最小值

 int maxDay = calendar.getActualMaximum(Calendar.DAY_OF_YEAR);
 System.out.println("今年的最大天数为:" + maxDay);
         
 int minDay = calendar.getActualMinimum(Calendar.DAY_OF_YEAR);
 System.out.println("今年的最小天数为:" + minDay);

测试结果:

 今年的最大天数为:365
 今年的最小天数为:1

2.4 调用set()方法设置日期分量

 package cn.tedu.date;
 
 import java.util.Calendar;
 
 /**
  * 有关于Calendar日历类的set方法案例演示
  * @author cjn
  *
  */
 public class CalendarDemo03 {
 
     public static void main(String[] args) {
         Calendar calendar = Calendar.getInstance();
         System.out.println(calendar);
         
         /*
          * void set(int field,int value)
          * 第一个参数是时间分量的常量值
          * 第二个参数是需要设置的时间值
          */
         //2008年 8月8日 20:08:08
         calendar.set(Calendar.YEAR, 2008);
         calendar.set(Calendar.MONTH, Calendar.AUGUST);//7表示8月
         calendar.set(Calendar.DATE, 8);
         calendar.set(Calendar.HOUR_OF_DAY, 20);
         calendar.set(Calendar.MINUTE, 8);
         calendar.set(Calendar.SECOND, 8);
         System.out.println(calendar);
         /*
          * 调用getTime方法的目的是因为设置了时间分量以后没有进行更新操作
          * 可以调用getTime()或者add()方法完成更新的操作,
          * 更新以后再次查看日历对象信息,即可看到完成设置显示的时间分量
          */
         System.err.println(calendar.getTime());
         System.out.println(calendar);    
    }
 
 }

测试结果:

 java.util.GregorianCalendar[time=1627567798371,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2021,MONTH=6,WEEK_OF_YEAR=31,WEEK_OF_MONTH=5,DAY_OF_MONTH=29,DAY_OF_YEAR=210,DAY_OF_WEEK=5,DAY_OF_WEEK_IN_MONTH=5,AM_PM=1,HOUR=10,HOUR_OF_DAY=22,MINUTE=9,SECOND=58,MILLISECOND=371,ZONE_OFFSET=28800000,DST_OFFSET=0]
 java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2008,MONTH=7,WEEK_OF_YEAR=31,WEEK_OF_MONTH=5,DAY_OF_MONTH=8,DAY_OF_YEAR=210,DAY_OF_WEEK=5,DAY_OF_WEEK_IN_MONTH=5,AM_PM=1,HOUR=10,HOUR_OF_DAY=20,MINUTE=8,SECOND=8,MILLISECOND=371,ZONE_OFFSET=28800000,DST_OFFSET=0]
 java.util.GregorianCalendar[time=1218197288371,areFieldsSet=true,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2008,MONTH=7,WEEK_OF_YEAR=32,WEEK_OF_MONTH=2,DAY_OF_MONTH=8,DAY_OF_YEAR=221,DAY_OF_WEEK=6,DAY_OF_WEEK_IN_MONTH=2,AM_PM=1,HOUR=8,HOUR_OF_DAY=20,MINUTE=8,SECOND=8,MILLISECOND=371,ZONE_OFFSET=28800000,DST_OFFSET=0]
 Fri Aug 08 20:08:08 CST 2008

2.5 add()方法

  Calenadr日历类中还提供了可以对时间分量的值进行计算的方法,需要使用所提供的add(int field,int amount)方法,第一个参数传入日历参数的常量值,第二个参数传入需要进行计算给定的值,如果希望是加法运算传入一个正数,如果需要进行减法运算传入一个负数,假设为当月月底,那么加一天以后,会显示下月的月初,月份这位会自动进位,减法也是同理。

 package cn.tedu.date;
 
 import java.util.Calendar;
 
 /**
  * 使用日历对象中提供的add方法对时间分量的值进行计算
  * @author cjn
  *
  */
 public class CalendarDemo04 {
 
     public static void main(String[] args) {
         Calendar calendar = Calendar.getInstance();
         //查看9年2个月零5天以后时哪一天?
         calendar.add(Calendar.YEAR, 9);
         calendar.add(Calendar.MONTH, 2);
         calendar.add(Calendar.DAY_OF_YEAR, 5);
         
         System.out.println(calendar.getTime());
         
         //查询当周的周一是哪天
         calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
         System.out.println(calendar.getTime());
 
    }
 }

测试结果:

 Fri Oct 04 22:27:11 CST 2030
 Mon Sep 30 22:27:11 CST 2030


posted @ 2021-07-29 23:08  Coder_Cui  阅读(339)  评论(0编辑  收藏  举报