之前我们学了Date类和SimpleDateFormat类,这两个都是时间和时间日期格式化操作的类。这篇学习Calendar类,叫日历类,而且是一个抽象类。在学习Date类的时候,看到API标注很多类已经过时了,这些过时的方法就是由Calendar类来替代的。
1.API阅读和基本使用
在JDK API 1.6文档,搜索打开Calendar类,可以找到它有一个子类,叫GregorianCalendar,中文意思是格林威治日历。实际上在使用Caleandar类是通过父类引用指向了子类对象。API文档告诉了我们如何使用Calendar类。
package otherclass;
import java.util.Calendar;
public class Demo1_Calendar {
public static void main(String[] args) {
Calendar c = Calendar.getInstance(); //父类引用指向子类对象
System.out.println(c);
}
}
打印结果:
java.util.GregorianCalendar[time=1524636399602,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=2018,MONTH=3,WEEK_OF_YEAR=17,WEEK_OF_MONTH=4,DAY_OF_MONTH=25,DAY_OF_YEAR=115,DAY_OF_WEEK=4,DAY_OF_WEEK_IN_MONTH=4,AM_PM=1,HOUR=2,HOUR_OF_DAY=14,MINUTE=6,SECOND=39,MILLISECOND=602,ZONE_OFFSET=28800000,DST_OFFSET=0]
打印一长串的日期,时间信息。很不友好,有时候我们只需要这些字段里面的一部分字段的值就可以,所有,下面学习一个常用的根据字段获取值的方法来实现我们的目的。
2.成员方法get(filed)
下面代码主要是练习get(filed)方法的使用和拼接成一个符合我们习惯的日期格式输出。
package otherclass;
import java.util.Calendar;
public class Demo1_Calendar {
public static void main(String[] args) {
Calendar c = Calendar.getInstance(); //父类引用指向子类对象
//获取年份
System.out.println(c.get(Calendar.YEAR));
//获取月份
System.out.println(c.get(Calendar.MONTH)); //注意这里月份是从0表示1月,所以输出3表示是4月份
//获取天
System.out.println(c.get(Calendar.DAY_OF_MONTH));
//获取星期几
System.out.println(c.get(Calendar.DAY_OF_WEEK)); //美国那边把周日作为这个星期的第一天
System.out.println("-------------------------");
// 下面来拼接成一个我们看得习惯的时间,日期格式
System.out.println(c.get(Calendar.YEAR)+"年"+(c.get(Calendar.MONTH)+1)+"月"
+c.get(Calendar.DAY_OF_MONTH)+"日 "+getWeek(c.get(Calendar.DAY_OF_WEEK)));
}
/*
* 写一个返回符合中国人习惯的星期几的方法
*/
publicstatic String getWeek(int week) {
String[] arr = {"","星期日","星期一","星期二","星期三","星期四","星期五","星期六"};
// 注意上面数组索引对应的星期,1表示星期日,索引0空着,因为Calendar.get(Calendar.DAY_OF_WEEK)的范围是1到7
return arr[week];
}
}
输出:
2018
3
25
4
-------------------------
2018年4月25日星期三
有时候,我们需要限制时间日期字符串的长度,也就是说,我们需要时间日期都是“2018年04月25日”的格式,有时候月份和天会是个数,所以我们需要写一个方法去前面一位补齐0.
package otherclass;
import java.util.Calendar;
public class Demo1_Calendar {
public static void main(String[] args) {
Calendar c = Calendar.getInstance(); //父类引用指向子类对象
// 下面来拼接成一个我们看得习惯的时间,日期格式
System.out.println(c.get(Calendar.YEAR)+"年"+(getNumber(c.get(Calendar.MONTH)+1))+"月"
+getNumber(c.get(Calendar.DAY_OF_MONTH))+"日 "+getNumber(c.get(Calendar.HOUR_OF_DAY))+ ":"
+getNumber(c.get(Calendar.MINUTE))+ ":"+getNumber(c.get(Calendar.SECOND))+ " "+
getWeek(c.get(Calendar.DAY_OF_WEEK)));
}
/*
* 写一个返回符合中国人习惯的星期几的方法
*/
public static String getWeek(int week) {
String[] arr = {"","星期日","星期一","星期二","星期三","星期四","星期五","星期六"};
// 注意上面数组索引对应的星期,1表示星期日,索引0空着,因为Calendar.get(Calendar.DAY_OF_WEEK)的范围是1到7
return arr[week];
}
/*
* 月份,天和时分秒补齐0
*/
public static String getNumber(int num) {
return (num > 9)? "" + num : "0" + num;
}
}
输出:
2018年04月25日 15:39:03 星期三
看04月和03秒确实产生了补齐0的效果。