1. 程式人生 > >java核心技術學習筆記(三)—GregorianCalendar

java核心技術學習筆記(三)—GregorianCalendar

我們平時常用的java時間工具類應該有Date和GregorianCalendar,其中Date類的例項狀態表示的是一個時間點,而GregorianCalendar則是以日曆的方式管理時間,非常方便的就可以實現時間的定位和時間的偏移(從現在這一刻往前或後延時幾天,幾小時等),相對於Date類,GregorianCalendar則靈活了很多。

使用GregorianCalendar需要注意的是月份從0開始計數,因此11表示十二月。為了清晰起見,也可以使用常量。如Calendar.DECEMBER。今天以例子+註釋的方式記錄GregorianCalendar的常見用法。

這個例項是按常見的日曆格式,列印了本月的日曆,執行結果如下:
這裡寫圖片描述

import java.text.DateFormatSymbols;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Locale;

public class CalendarTest {
    public static void main(String[] args) {
        Calendar.DECEMBER
        // 設定預設位置
        Locale.setDefault(Locale.CHINESE);
        // 獲取當前日期
GregorianCalendar calendar = new GregorianCalendar(); // 獲取今天是當前月的第幾天 int today = calendar.get(Calendar.DAY_OF_MONTH); // 獲取當前是今年第幾個月;一月是0 int month = calendar.get(Calendar.MONTH); // 將時間設為當前月第一天 calendar.set(Calendar.DAY_OF_MONTH, 1); // 獲取本月第一天是一週的第幾天
int weekday = calendar.get(Calendar.DAY_OF_WEEK); // 獲取星期是從那天開始,美國週日是星期的第一天 int firstDayOfWeek = calendar.getFirstDayOfWeek(); // 確定本月第一天是星期幾,前面應該輸出多少空位 int indent = 0; // 迴圈計算本月的第一天是一個星期的第幾天,以確定第一行輸出多少空格 while (weekday != firstDayOfWeek) { indent++; // 輸出空格計數+1 // 把日期往前減一天,非常方便的調整時間, // add負數,時間往前推,反之後推 calendar.add(Calendar.DAY_OF_MONTH, -1); // 前一天是一星期的第幾天 weekday = calendar.get(Calendar.DAY_OF_WEEK); } // 獲取星期簡寫(Sun Mon Tue...) String[] weekdayNames = new DateFormatSymbols().getShortWeekdays(); do { // 經過上面的迴圈,這裡weekday已經是一個星期的第一天了 // 這裡輸出星期標題 System.out.printf("%8s",weekdayNames[weekday]); calendar.add(Calendar.DAY_OF_MONTH, 1); weekday = calendar.get(Calendar.DAY_OF_WEEK); } while (weekday != firstDayOfWeek); System.out.println(); // 列印本月第一天距星期第一天之間的空格 for (int i = 0; i < indent; i++) { System.out.print(" "); } // 重置日期為本月第一天 calendar.set(Calendar.DAY_OF_MONTH, 1); // 列印日期 do { int day = calendar.get(Calendar.DAY_OF_MONTH); System.out.printf("%6d",day); // 用*標記當前天 if (day == today) { System.out.print("*"); }else { System.out.print(" "); } // 列印完後,日期後推一天 calendar.add(Calendar.DAY_OF_MONTH, 1); weekday = calendar.get(Calendar.DAY_OF_WEEK); // 列印到下一週換行 if (weekday == firstDayOfWeek) { System.out.println(); } } // 如果還在本月,就一直列印直到下個月 while (calendar.get(Calendar.MONTH) == month); } }

GregorianCalendar相對於Date類還是有不少優越性的,如果只是獲取一下當前時間點,當然一個Date類就夠了,但是如果需要管理時間,計算時間段,時間往前或者往後延伸,那麼GregorianCalendar的優越性還是很明顯的