Calendar 类是一个抽象类,为我们提供了关于日期计算的相关功能,比如:年、月、日、时、分、秒的展示和计算。
GregorianCalendar 是 Calendar 的一个具体子类,提供了世界上大多数国家/地区使用的标准日历系统。
菜鸟雷区
注意月份的表示,一月是0,二月是1,以此类推,12月是11。 因为大多数人习惯于使用单词而不是使用数字来表示月份,这样程序也许更易读,父类Calendar使用常量来表示月份:JANUARY、FEBRUARY等等。
【示例】GregorianCalendar类和Calendar类的使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
<code>import</code> <code>java.util.*;</code>
<code>public</code> <code>class</code> <code>TestCalendar {</code>
<code> </code><code>public</code> <code>static</code> <code>void</code> <code>main(String[] args) {</code>
<code> </code><code>// 得到相关日期元素</code>
<code> </code><code>GregorianCalendar calendar = </code><code>new</code> <code>GregorianCalendar(</code><code>2999</code><code>, </code><code>10</code><code>, </code><code>9</code><code>, </code><code>22</code><code>, </code><code>10</code><code>, </code><code>50</code><code>);</code>
<code> </code><code>int</code> <code>year = calendar.get(Calendar.YEAR); </code><code>// 打印:1999</code>
<code> </code><code>int</code> <code>month = calendar.get(Calendar.MONTH); </code><code>// 打印:10</code>
<code> </code><code>int</code> <code>day = calendar.get(Calendar.DAY_OF_MONTH); </code><code>// 打印:9</code>
<code> </code><code>int</code> <code>day2 = calendar.get(Calendar.DATE); </code><code>// 打印:9</code>
<code> </code><code>// 日:Calendar.DATE和Calendar.DAY_OF_MONTH同义</code>
<code> </code><code>int</code> <code>date = calendar.get(Calendar.DAY_OF_WEEK); </code><code>// 打印:3</code>
<code> </code><code>// 星期几 这里是:1-7.周日是1,周一是2,。。。周六是7</code>
<code> </code><code>System.out.println(year);</code>
<code> </code><code>System.out.println(month);</code>
<code> </code><code>System.out.println(day);</code>
<code> </code><code>System.out.println(day2);</code>
<code> </code><code>System.out.println(date);</code>
<code> </code><code>// 设置日期</code>
<code> </code><code>GregorianCalendar calendar2 = </code><code>new</code> <code>GregorianCalendar();</code>
<code> </code><code>calendar2.set(Calendar.YEAR, </code><code>2999</code><code>);</code>
<code> </code><code>calendar2.set(Calendar.MONTH, Calendar.FEBRUARY); </code><code>// 月份数:0-11</code>
<code> </code><code>calendar2.set(Calendar.DATE, </code><code>3</code><code>);</code>
<code> </code><code>calendar2.set(Calendar.HOUR_OF_DAY, </code><code>10</code><code>);</code>
<code> </code><code>calendar2.set(Calendar.MINUTE, </code><code>20</code><code>);</code>
<code> </code><code>calendar2.set(Calendar.SECOND, </code><code>23</code><code>);</code>
<code> </code><code>printCalendar(calendar2);</code>
<code> </code><code>// 日期计算</code>
<code> </code><code>GregorianCalendar calendar3 = </code><code>new</code> <code>GregorianCalendar(</code><code>2999</code><code>, </code><code>10</code><code>, </code><code>9</code><code>, </code><code>22</code><code>, </code><code>10</code><code>, </code><code>50</code><code>);</code>
<code> </code><code>calendar3.add(Calendar.MONTH, -</code><code>7</code><code>); </code><code>// 月份减7</code>
<code> </code><code>calendar3.add(Calendar.DATE, </code><code>7</code><code>); </code><code>// 增加7天</code>
<code> </code><code>printCalendar(calendar3);</code>
<code> </code><code>// 日历对象和时间对象转化</code>
<code> </code><code>Date d = calendar3.getTime();</code>
<code> </code><code>GregorianCalendar calendar4 = </code><code>new</code> <code>GregorianCalendar();</code>
<code> </code><code>calendar4.setTime(</code><code>new</code> <code>Date());</code>
<code> </code><code>long</code> <code>g = System.currentTimeMillis();</code>
<code> </code><code>}</code>
<code> </code><code>static</code> <code>void</code> <code>printCalendar(Calendar calendar) {</code>
<code> </code><code>int</code> <code>year = calendar.get(Calendar.YEAR);</code>
<code> </code><code>int</code> <code>month = calendar.get(Calendar.MONTH) + </code><code>1</code><code>;</code>
<code> </code><code>int</code> <code>day = calendar.get(Calendar.DAY_OF_MONTH);</code>
<code> </code><code>int</code> <code>date = calendar.get(Calendar.DAY_OF_WEEK) - </code><code>1</code><code>; </code><code>// 星期几</code>
<code> </code><code>String week = </code><code>""</code> <code>+ ((date == </code><code>0</code><code>) ? </code><code>"日"</code> <code>: date);</code>
<code> </code><code>int</code> <code>hour = calendar.get(Calendar.HOUR);</code>
<code> </code><code>int</code> <code>minute = calendar.get(Calendar.MINUTE);</code>
<code> </code><code>int</code> <code>second = calendar.get(Calendar.SECOND);</code>
<code> </code><code>System.out.printf(</code><code>"%d年%d月%d日,星期%s %d:%d:%d\n"</code><code>, year, month, day, </code>
<code> </code><code>week, hour, minute, second);</code>
<code>}</code>
执行结果如图所示:

编写程序,利用GregorianCalendar类,打印当前月份的日历,今天的日期是 2017-05-18 ,如图所示为今日所在月份的日历:
【示例】可视化日历的编写
<code>import</code> <code>java.text.ParseException;</code>
<code>import</code> <code>java.util.Calendar;</code>
<code>import</code> <code>java.util.GregorianCalendar;</code>
<code>import</code> <code>java.util.Scanner;</code>
<code>public</code> <code>class</code> <code>TestCalendar2 {</code>
<code> </code><code>public</code> <code>static</code> <code>void</code> <code>main(String[] args) </code><code>throws</code> <code>ParseException {</code>
<code> </code><code>System.out.println(</code><code>"请输入日期(格式为:2010-3-3):"</code><code>);</code>
<code> </code><code>Scanner scanner = </code><code>new</code> <code>Scanner(System.in);</code>
<code> </code><code>String dateString = scanner.nextLine(); </code><code>// 2010-3-1</code>
<code> </code><code>// 将输入的字符串转化成日期类</code>
<code> </code><code>System.out.println(</code><code>"您刚刚输入的日期是:"</code> <code>+ dateString);</code>
<code> </code><code>String[] str = dateString.split(</code><code>"-"</code><code>);</code>
<code> </code><code>int</code> <code>year = Integer.parseInt(str[</code><code>0</code><code>]);</code>
<code> </code><code>int</code> <code>month = </code><code>new</code> <code>Integer(str[</code><code>1</code><code>]);</code>
<code> </code><code>int</code> <code>day = </code><code>new</code> <code>Integer(str[</code><code>2</code><code>]);</code>
<code> </code><code>Calendar c = </code><code>new</code> <code>GregorianCalendar(year, month - </code><code>1</code><code>, day); </code><code>// Month:0-11</code>
<code> </code><code>// 大家自己补充另一种方式:将字符串通过SImpleDateFormat转化成Date对象,</code>
<code> </code><code>//再将Date对象转化成日期类</code>
<code> </code><code>// SimpleDateFormat sdfDateFormat = new SimpleDateFormat("yyyy-MM-dd");</code>
<code> </code><code>// Date date = sdfDateFormat.parse(dateString);</code>
<code> </code><code>// Calendar c = new GregorianCalendar();</code>
<code> </code><code>// c.setTime(date);</code>
<code> </code><code>// int day = c.get(Calendar.DATE);</code>
<code> </code><code>c.set(Calendar.DATE, </code><code>1</code><code>);</code>
<code> </code><code>int</code> <code>dow = c.get(Calendar.DAY_OF_WEEK); </code><code>// week:1-7 日一二三四五六</code>
<code> </code><code>System.out.println(</code><code>"日\t一\t二\t三\t四\t五\t六"</code><code>);</code>
<code> </code><code>for</code> <code>(</code><code>int</code> <code>i = </code><code>0</code><code>; i < dow - </code><code>1</code><code>; i++) {</code>
<code> </code><code>System.out.print(</code><code>"\t"</code><code>);</code>
<code> </code><code>}</code>
<code> </code><code>int</code> <code>maxDate = c.getActualMaximum(Calendar.DATE);</code>
<code> </code><code>// System.out.println("maxDate:"+maxDate);</code>
<code> </code><code>for</code> <code>(</code><code>int</code> <code>i = </code><code>1</code><code>; i <= maxDate; i++) {</code>
<code> </code><code>StringBuilder sBuilder = </code><code>new</code> <code>StringBuilder();</code>
<code> </code><code>if</code> <code>(c.get(Calendar.DATE) == day) {</code>
<code> </code><code>sBuilder.append(c.get(Calendar.DATE) + </code><code>"*\t"</code><code>);</code>
<code> </code><code>} </code><code>else</code> <code>{</code>
<code> </code><code>sBuilder.append(c.get(Calendar.DATE) + </code><code>"\t"</code><code>);</code>
<code> </code><code>}</code>
<code> </code><code>System.out.print(sBuilder);</code>
<code> </code><code>// System.out.print(c.get(Calendar.DATE)+</code>
<code> </code><code>// ((c.get(Calendar.DATE)==day)?"*":"")+"\t");</code>
<code> </code><code>if</code> <code>(c.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY) {</code>
<code> </code><code>System.out.print(</code><code>"\n"</code><code>);</code>
<code> </code><code>c.add(Calendar.DATE, </code><code>1</code><code>);</code>