GregorianCalendar類(lèi)的學(xué)習(xí)

字號(hào):

GregorianCalendar 是 Calendar 的一個(gè)具體子類(lèi),提供了世界上大多數(shù)國(guó)家/地區(qū)使用的標(biāo)準(zhǔn)日歷系統(tǒng)。
    GregorianCalendar 是一種混合日歷,在單一間斷性的支持下同時(shí)支持儒略歷和格里高利歷系統(tǒng),在默認(rèn)情況下,它對(duì)應(yīng)格里高利日歷創(chuàng)立時(shí)的格里高利歷日期(某些國(guó)家/地區(qū)是在 1582 年 10 月 15 日創(chuàng)立,在其他國(guó)家/地區(qū)要晚一些)??捎烧{(diào)用者通過(guò)調(diào)用 setGregorianChange() 來(lái)更改起始日期。
    歷,在那些首先采用格里高利歷的國(guó)家/地區(qū)中,1582 年 10 月 4 日(儒略歷)之后就是 1582 年 10 月 15 日(格里高利歷)。此日歷正確地模擬了這些變化。在開(kāi)始格里高利歷之前,GregorianCalendar 實(shí)現(xiàn)的是儒略歷。格里高利歷和儒略歷之間的區(qū)別就是閏年規(guī)則。儒略歷指定每 4 年就為閏年,而格里高利歷則忽略不能被 400 整除的世紀(jì)年。
    GregorianCalendar 可實(shí)現(xiàn)預(yù)期的 格里高利歷和儒略歷。考試大提示: 也就是說(shuō),可以通過(guò)在時(shí)間上無(wú)限地向后或向前外推當(dāng)前規(guī)則來(lái)計(jì)算日期。因此,對(duì)于所有的年份,都可以使用 GregorianCalendar 來(lái)生成有意義并且一致的結(jié)果。但是,采用現(xiàn)代儒略歷規(guī)則時(shí),使用 GregorianCalendar 得到的日期只在歷從公元 4 年 3 月 1 日之后是準(zhǔn)確的。在此日期之前,閏年規(guī)則的應(yīng)用沒(méi)有規(guī)則性,在 45 BC 之前,甚至不存在儒略歷。
    在格里高利歷創(chuàng)立以前,新年是 3 月 25 日。為了避免混淆,此日歷始終使用 1 月 1 日為新年。如果想要格里高利歷轉(zhuǎn)換之前并且處于 1 月 1 日和 3 月 24 日之間的日期,則可以進(jìn)行手動(dòng)調(diào)整。
    為 WEEK_OF_YEAR 字段所計(jì)算的值的范圍從 1 到 53。一年的第一個(gè)星期始于 getFirstDayOfWeek() 的最早 7 天,至少包含該年的 getMinimalDaysInFirstWeek() 各天。這取決于 getMinimalDaysInFirstWeek()、getFirstDayOfWeek() 的值以及 1 月 1 日是星期幾。一年的第一個(gè)星期和下一年的第一個(gè)星期之間的各個(gè)星期按順序從 2 到 52 或 53(根據(jù)需要)進(jìn)行編號(hào)。
    例如,1998 年 1 月 1 日是星期四。如果 getFirstDayOfWeek() 為 MONDAY,并且 getMinimalDaysInFirstWeek() 為 4(這些值反映了 ISO 8601 和很多國(guó)家/地區(qū)標(biāo)準(zhǔn)),則 1998 年的第一個(gè)星期開(kāi)始于 1997 年 12 月 29 日,結(jié)束于 1998 年 1 月 4 日。但是,考試大提示: 如果 getFirstDayOfWeek() 為 SUNDAY,那么 1998 年的第一個(gè)星期開(kāi)始于 1998 年 1 月 4 日,結(jié)束于 1998 年 1 月 10 日;1998 年頭三天是 1997 年第 53 個(gè)星期的一部分。
    為 WEEK_OF_MONTH 字段所計(jì)算的值的范圍從 0 到 6。一個(gè)月的第一個(gè)星期(WEEK_OF_MONTH = 1 的日期)是該月至少連續(xù) getMinimalDaysInFirstWeek() 天中的最早日期,結(jié)束于 getFirstDayOfWeek() 的前一天。與一年的第一個(gè)星期不同,Examda,一個(gè)月的第一個(gè)星期可能短于 7 天,也不必從 getFirstDayOfWeek() 這一天開(kāi)始,并且不包括前一個(gè)月的日期。在第一個(gè)星期之前該月日期的 WEEK_OF_MONTH 為 0。
    例如,如果 getFirstDayOfWeek() 為 SUNDAY,getMinimalDaysInFirstWeek() 為 4,那么 1998 年 1 月的第一個(gè)星期是從 1 月 4 日星期日到 1 月 10 日星期六。這些天的 WEEK_OF_MONTH 為 1。1 月 1 日星期四到 1 月 3 日星期六的 WEEK_OF_MONTH 為 0。如果 getMinimalDaysInFirstWeek() 變?yōu)?3,則 1 月 1 日到 1 月 3 日的 WEEK_OF_MONTH 為 1。
    simple Demo
    import java.util.*;
    public class GregorianCalendarTest
    {
    public static void main(String[] args) {
    //構(gòu)造當(dāng)前日期的日期對(duì)象
    GregorianCalendar date = new GregorianCalendar();
    //獲得當(dāng)前日期的日
    int today = date.get(Calendar.DAY_OF_MONTH);
    //獲得當(dāng)前日期的月份
    int month = date.get(Calendar.MONTH);
    //更改當(dāng)前日期的日為當(dāng)月的第一天
    date.set(Calendar.DAY_OF_MONTH, 1);
    //獲得當(dāng)前為星期幾(1-星期天)
    int weekDay = date.get(Calendar.DAY_OF_WEEK);
    //打印日歷頭
    System.out.println("Sun Mon Tue Wed Thu Fri Sat");
    for (int i = Calendar.SUNDAY; i < weekDay; i++)
    {
    System.out.print(" ");
    }
    //循環(huán)打印每天
    do
    {
    //獲得當(dāng)前號(hào)
    int day = date.get(Calendar.DAY_OF_MONTH);
    System.out.printf("%3d", day);
    //是否當(dāng)天的號(hào)
    if (day == today)
    {
    System.out.print("*");
    }else {
    System.out.print(" ");
    }
    //星期六換行
    if (weekDay == Calendar.SATURDAY)
    {
    System.out.println();
    }
    //下一天
    date.add(Calendar.DAY_OF_MONTH, 1);
    //下一天為星期幾
    weekDay = date.get(Calendar.DAY_OF_WEEK);
    }
    while (date.get(Calendar.MONTH) == month);
    //最后的換行
    if (weekDay != Calendar.SUNDAY)
    {
    System.out.println();
    }
    }
    }