1 import java.util.Calendar;
2 /**
3 * 日历类
4 */
5 public class TestCalendar {
6 public static void main(String[] args) {
7 /**
8 * java.util.Calendar 日历类
9 *
10 * 1.由于Calendar类是抽象类,且Calendar类的构造方法是protected的,
11 * 所以无法使用Calendar类的构造方法来创建对象,API中提供了getInstance方法用来创建对象。
12 *
13 * 2.使用该方法获得的Calendar对象就代表当前的系统时间,由于Calendar类toString实现的没有Date类那么直观,
14 * 所以直接输出Calendar类的对象意义不大。
15 */
16 Calendar cal = Calendar.getInstance(); //返回当前日历对象
17
18 /**
19 * set方法的声明为:public final void set(int year,int month,int date)
20 *
21 * Calendar类中年份的数值直接书写,月份的值为实际的月份值减1,日期的值就是实际的日期值。
22 */
23 cal.set(2016, 2, 23);
24 System.out.println(cal.getTime()); // 获取为日期Date类型:Wed Mar 23 12:19:30 CST 2016
25
26 /**
27 * 如果只设定某个字段:
28 *
29 * 例如日期的值,则可以使用如下set方法:
30 * public void set(int field,int value)
31 *
32 *
33 * 在该方法中,参数field代表要设置的字段的类型,常见类型如下:
34 * Calendar.YEAR---年份;
35 * Calendar.MONTH---月份;
36 * Calendar.DATE---日期;
37 * Calendar.DAY_OF_MONTH---日期,和Calendar.DATE字段完全相同;
38 * Calendar.HOUR---12小时制的小时数;
39 * Calendar.HOUR_OF_DAY---24小时制的小时数;
40 * Calendar.MINUTE---分钟;
41 * Calendar.SECOND---秒;
42 * Calendar.DAY_OF_WEEK---星期几。
43 *
44 * 在Calendar类中,周日是1,周一是2,周二是3,依次类推。周六为最后一天
45 *
46 * 后续的参数value代表设置成的值。
47 * 例如:
48 * c1.set(Calendar.DATE,10);
49 * 该代码的作用是将c1对象代表的时间中日期设置为10号,其它所有的数值会被重新计算,
50 * 例如星期几以及对应的相对时间数值等。
51 */
52 cal.set(Calendar.DATE, 10); //修改日期为10号,修改之后cal对应的星期等都会重新计算
53
54 /**
55 * 获得Calendar类中的信息:
56 */
57 int year =cal.get(cal.YEAR); //获取年份
58 int month = cal.get(cal.MONTH); //获取月份
59 int date = cal.get(cal.DATE); //获取日期
60
61 int date1 = cal.get(cal.DAY_OF_MONTH); //获取日期和cal.DATE一样
62 int day = cal.get(cal.DAY_OF_WEEK); //获取星期几
63 int day2 = cal.get(cal.DAY_OF_YEAR); //获取当前是一年中的第多少天
64 //某月中第几周,以月份天数为标准
65 int day3 = cal.get(cal.DAY_OF_WEEK_IN_MONTH);//按这个月1号算,1号起就是第1周,8号起就是第2周。
66
67 int hour = cal.get(cal.HOUR); //获取12小时制的小时数
68 int hour2 = cal.get(cal.HOUR_OF_DAY); //获取24小时制的小时数
69
70 int minute = cal.get(cal.MINUTE); //获取分钟
71 int second = cal.get(cal.SECOND); //获取秒
72
73 int week1 = cal.get(cal.WEEK_OF_YEAR); //一年中的第几周
74 int week2 = cal.get(cal.WEEK_OF_MONTH); //日历式的第几周
75
76
77 /**
78 * 如果需要指定一周的开始日期,则需要在指定开始日期之后再设置日期
79 * 默认一周的开始为周日,结束为周六
80 */
81 cal.setFirstDayOfWeek(Calendar.MONDAY); //设置一周的第一天为MONDAY
82
83
84 /**
85 * 获取指定日期所在月最小日和最大日 最大日28天 29天 30天 31天
86 */
87 Calendar calendar = Calendar.getInstance(); //返回当前日历对象
88 int minDay = calendar.getActualMinimum(Calendar.DATE);
89 int maxDay = calendar.getActualMaximum(Calendar.DATE); // 获取当月最大天数
90 System.out.println(minDay + "-" + maxDay); //1 - 31
91
92 /**
93 * 其他方法说明:
94 * (1)add方法: public abstract void add(int field,int amount)
95 * 该方法的作用是在Calendar对象中的某个字段上增加或减少一定的数值,增加是amount的值为正,减少是amount的值为负。
96 */
97
98 /**
99 * 例如计算当前时间100天以后的日期,代码如下:
100 * 这里add方法是指在c3对象的Calendar.DATE,也就是日期字段上增加100,
101 * 类内部会重新计算该日期对象中其它各字段的值,从而获得100天以后的
102 */
103 Calendar c3 = Calendar.getInstance();
104 c3.add(Calendar.DATE,100);
105 int year1 = c3.get(Calendar.YEAR);
106 int month1 = c3.get(Calendar.MONTH);
107 int d1 = c3.get(Calendar.DATE);
108 System.out.println(year1 + "年" + month1 + "月" + d1 + "日");
109
110 /**
111 * (2)after方法: public boolean after(Object when)
112 * 该方法的作用是判断当前日期对象是否在when对象的后面,如果在when对象的后面则返回true,否则返回false。
113 *
114 * (3)before方法: 该方法是判断当前日期对象是否位于另外一个日期对象之前。
115 */
116 Calendar c4 = Calendar.getInstance();
117 c4.set(2016,8-1,28);
118
119 Calendar c5 = Calendar.getInstance();
120 c5.set(2016,10-1,1);
121 boolean b = c5.after(c4); //判断两个日期前后
122 System.out.println(b);
123
124 /**
125 * Calendar对象和相对时间之间的转换:
126 *
127 * 1.在转换时,使用Calendar类中的getTimeInMillis方法可以将Calendar对象转换为相对时间。
128 *
129 * 2.在将相对时间转换为Calendar对象时,首先创建一个Calendar对象,
130 * 然后再使用Calendar类的setTimeInMillis方法设置时间即可。
131 */
132 Calendar c6 = Calendar.getInstance();
133 long t1 = c6.getTimeInMillis(); //将Calendar对象转换为相对时间
134
135 Calendar c9 = Calendar.getInstance();
136 long t = 1252785271098L;
137 c9.setTimeInMillis(t); //将相对时间转换成Calendar对象
138
139 /**
140 * 计算2016年8月20号和2016年8月29号之间相差的天数。
141 *
142 *
143 * 原理:
144 * 首先代表两个特定的时间点,这里使用Calendar的对象进行代表,然后将两个时间点转换为对应的相对时间,
145 * 求两个时间点相对时间的差值,然后除以一天的毫秒数(24小时*60分钟*60秒*1000毫秒)即可获得对应的天数
146 */
147
148 Calendar c1 = Calendar.getInstance();
149 c1.set(2016, 8-1,20);
150 long time1 = c1.getTimeInMillis();
151
152 Calendar c2 = Calendar.getInstance();
153 c2.set(2016, 8-1,29);
154 long time2 = c1.getTimeInMillis();
155
156 //计算天数
157 long days = (time2-time1)/(24*60*60*1000);
158 }
159 }