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) + "天");