Calendar类
平时用到时间戳主要是用java.sql.Timestamp这个类,但是Timestamp获取年月日时分秒的方法现在都标注不推荐了,为了防止官方哪天突然给他删了,可以用Calendar类做一些替代操作。
Calendar对象初始化
Calendar cal = Calendar.getInstance(); // 返回一个基于当前时间和默认时区、区域设置的日历对象
日历一般配合时间戳使用,所以还需要设置时间
cal.setTime(timestamp); //这里的timestamp可以是任意一个Date格式的对象
这个方法的本质是把timestamp的毫秒数赋给cal,所以以下操作可以达到相同效果
cal.setTimeInMillis(timestamp.getTime());
Calendar对象常用方法
//获取时间
Date time = cal.getTime();//date=Sun Jan 27 16:27:27 CST 2019
//获取年
int year = cal.get(Calendar.YEAR); //year=2019
//获取月份 Calendar.MONTH从0开始(1月是0,12月是11) ,使用时通常会+1
int month = cal.get(Calendar.MONTH) + 1; //month=1
//获取当前是本月的第多少天:两种方法等价
int day_of_month = cal.get(Calendar.DAY_OF_MONTH); //day_of_month=27
int day = cal.get(Calendar.DATE); //day=27
//获取当月天的最大值,即当月有多少天
int max_day_of_month = cal.getActualMaximum(Calendar.DAY_OF_MONTH); //max_day_of_month=31
//获取当前小时(24小时制)
int hour24 = cal.get(Calendar.HOUR_OF_DAY); //hour24=16
//12小时制
int hour12 = cal.get(Calendar.HOUR); //hour12=4
//获取当前:分钟
int minute = cal.get(Calendar.MINUTE); //minute=27
//当前秒
int second = cal.get(Calendar.SECOND); //second=27
//星期几:用数字(1~7)表示(星期日~星期六),使用时通常会-1
int day_of_week = cal.get(Calendar.DAY_OF_WEEK) - 1; //day_of_week=0
//上午-0;下午-1
int amOrPm = cal.get(Calendar.AM_PM); //amOrPm=1
//当前年的第几周
int week_of_year = cal.get(Calendar.WEEK_OF_YEAR); //week_of_year=5
//当前月的星期数
int week_of_month = cal.get(Calendar.WEEK_OF_MONTH); //week_of_month=5
//当前月中的第几个星期
int day_of_week_in_month = cal.get(Calendar.DAY_OF_WEEK_IN_MONTH); //day_of_week_in_month=4
//当前年的第几天
int day_of_year = cal.get(Calendar.DAY_OF_YEAR); //day_of_year=27
注意项
Calendar有很多方法都是复用的,比如get()方法和getActualMaximum()方法,传入的参数是一个用来区分要调用的功能的整形。所以如果想用getActualMaximum()方法获得一个月的最大天数,即:
int actualMaximum = cal.getActualMaximum(Calendar.DAY_OF_YEAR);//一年最大天数
actualMaximum = cal.getActualMaximum(Calendar.DAY_OF_MONTH);//一月最大天数
但如果想要获取下个月的最大天数,就不能直接:
actualMaximum = calendar.getActualMaximum(Calendar.DAY_OF_MONTH+1);
Calendar.DAY_OF_MONTH(DATE)的值是一个定值5,所以加1后传入的值为6,等效于DAY_OF_YEAR,最后会返回给actualMaximum一个值365(或366),如果想要获取时间戳所指向的下一个月或年的最大天数,应该:
cal.add(Calendar.MONTH,1);
actualMaximum = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
这个操作是给当前日历对象cal所指向的月份+1,想操作年份或天数的话同理将Calendar.MONTH替换成Calendar.YEAR或Calendar.DAY_OF_YEAR即可,同理,如果想获取的是上一个月的,给月数-1即可:
cal.add(Calendar.MONTH,-1);
actualMaximum = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
- 综上,形如Calendar.DAY_OF_MONTH的参数起到的其实是一个类似枚举类的作用,用来标识在调用某个可复用方法时实际想要使用的方法。