java核心技術學習筆記(三)—GregorianCalendar
阿新 • • 發佈:2019-01-01
我們平時常用的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的優越性還是很明顯的