Calendar
java.util.Calendar
日历类:该类是一个抽象类,封装了对时间对的相关操作。
常用的实现类格里高利历(阳历)
使用日历类是为了对时间进行相关的操作,比如计算时间。
eg:
/*
* 使用Calendar的静态方法创建实例,
* 该方法会根据当前系统所在地区创建一个相应的实现,通常是GregorianCalendar
* 默认创建的日历实例表示当前系统时间。
*/
Calendar calendar = Calendar.getInstance();
/*
* toString不能直观反映表示的日期
*/
System.out.println(calendar);
结果:java.util.GregorianCalendar[time=1584275911367,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=2020,MONTH=2,WEEK_OF_YEAR=12,WEEK_OF_MONTH=3,DAY_OF_MONTH=15,DAY_OF_YEAR=75,DAY_OF_WEEK=1,DAY_OF_WEEK_IN_MONTH=3,AM_PM=1,HOUR=8,HOUR_OF_DAY=20,MINUTE=38,SECOND=31,MILLISECOND=367,ZONE_OFFSET=28800000,DST_OFFSET=0]
/*
* Calendar与Date之间的转换
*
* Calendar -> Date
* Date getTime()
* Calendar提供了方法getTime(),该方法返回一个Date对象,
* 该对象表示的时间就是当前Calendar表示的时间。
*/
Date date = calendar.getTime();
System.out.println(date);
//表示明天这一时刻
date.setTime(date.getTime()+1000*60*60*24);
System.out.println(date);
/*
* Date ->Calendar
* void setTime(Date date)
* Calendar的setTime方法就可以使当前Calendar表示给定的Date所示的时间。
*/
//Calendar也表示明天这一刻了
calendar.setTime(date);
Calendar提供了针对不同时间分量单独设置值的方法
void set(int field,int value)
其中第一个参数为:时间分量,例如:年,月,日等等。
第二个参数为对应的值。
时间分量是一个int值,使用Calendar提供的常量。
eg:
Calendar calendar = Calendar.getInstance();
System.out.println(calendar.getTime());
/*
* 设置Calendar,使其表示2008-08-08 20:08-08
*/
//设定年
calendar.set(Calendar.YEAR,2008);
System.out.println(calendar.getTime());
/*
* 设定月
* 月从0开始,0表示1月。
* 或者可以使用具体月的常量。
*/
//calendar.set(Calendar.MONTH,Calendar.AUGUST);
calendar.set(Calendar.MONTH,7);
System.out.println(calendar.getTime());
/*
* 设置日
* 对应的时间分量常用的:
* DATE:月中天
* DAY_OF_MONTH:月中的天,与DATE一致
* DAY_OF_WEEK:周中的天,星期几
* DAY_OF_YEAR:年中的天
*/
calendar.set(Calendar.DAY_OF_MONTH,8);
System.out.println(calendar.getTime());
//时
calendar.set(Calendar.HOUR_OF_DAY, 20);
//分
calendar.set(Calendar.MINUTE, 8);
//秒
calendar.set(Calendar.SECOND, 8);
System.out.println(calendar.getTime());
获取一个Calendar表示的日期中各个时间分量对应的值
Calendar calendar = Calendar.getInstance();
/*
* int get(int field)
* 获取对应时间分量的值
*/
//获取年
int year = calendar.get(Calendar.YEAR);
//获取月
int month = calendar.get(Calendar.MONTH)+1;
//获取日
int day = calendar.get(Calendar.DATE);
System.out.println(year+"-"+month+"-"+day);
int hour = calendar.get(Calendar.HOUR);
int minute = calendar.get(Calendar.MINUTE);
int second = calendar.get(Calendar.SECOND);
System.out.println(hour+":"+minute+":"+second);
//查看星期几?
int dow = calendar.get(Calendar.DAY_OF_WEEK);
System.out.println("周"+(dow==1?7:dow-1));
String[] date = {"日","一","二","三","四","五","六"};
System.out.println("周"+date[dow-1]);
//到今天为止,今年已经过了多少天?
int doy = calendar.get(Calendar.DAY_OF_YEAR);
System.out.println(year+"年已经过了"+doy+"天");
获取某一个时间分量所允许的最大值
Calendar calendar = Calendar.getInstance();
//当月总共有多少天?
int days = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
System.out.println(days);
//查看2016年2月多少天?
calendar.set(Calendar.YEAR, 2016);
calendar.set(Calendar.MONTH, 1);
days = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
System.out.println(days);
//2016年总共多少天?
days = calendar.getActualMaximum(Calendar.DAY_OF_YEAR);
System.out.println("2016年共"+days+"天");
Calendar中计算时间的方法
void add(int field.int value)
对指定的时间分量加上给定的值,若给定的值是负数,则是减去给定的值。
eg:
/*
* 查看3年2个月零1天以后的日期?
*/
Calendar calendar = Calendar.getInstance();
//查看3年后
calendar.add(Calendar.YEAR, 3);
System.out.println(calendar.getTime());
//再查看2个月后
calendar.add(Calendar.MONTH, 2);
System.out.println(calendar.getTime());
//再查看8天后
calendar.add(Calendar.DAY_OF_YEAR, 8);
System.out.println(calendar.getTime());
//再查看5小时以前?
calendar.add(Calendar.HOUR, -5);
System.out.println(calendar.getTime());
注意:
当遇到类似开发需求:要求用户输入一个日期,然后对该日期进行一系列的运算,再将计算后的日期显示给用户时。
流程如下:
1:获取用户输入的日期字符串
2:使用SimpleDateFormat将其转换为Date
3:创建一个Calendar,使其表示Date表示的日期
4:使用Calendar根据需求计算时间
5:将Calendar转换为一个Date
6:使用SimpleDateFormat将Date转换为字符串后显示给用户
eg:
/**
* 要求用户输入自己的生日,格式为:
* 2000-09-02
* 经过计算,输出:
* 到今天为止一共活了XXXX天。
* 以及距离10000天还有多少天。
* 生存10000天的纪念日是:2028-01-19
*
*/
System.out.println("输入您的生日:");
Scanner scanner = new Scanner(System.in);
String birstr = scanner.nextLine();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date birth = sdf.parse(birstr);
//计算已经活了多少天?
Date now = new Date();
long time = now.getTime()-birth.getTime();
time = time/1000/60/60/24;
System.out.println("恭喜您!到今天为止已经活了"+time+"天,请继续保持!");
time = 10000 - time;
System.out.println("距离10000天,还有"+time+"天!");
time = time*1000*60*60*24;
now.setTime(now.getTime()+time);
System.out.println("生存10000天的纪念日为:"+sdf.format(now));