java時間操作三部曲之java.util.GregoiranCalendar


     前面已經介紹過了它的祖先Date和父親Calendar,今天就來認識一下GregorianCalendar。在java1.0版本的時候Date還是很強大的,但是java類庫的設計者認為保存時間和給時間點命名的類要分開,於是就有了表示時間的Date和表示大家熟悉的日歷表示法的GregorianClendar。上一篇介紹了Calendar,實際上今天的主角就是擴展了Calendar,變得更加通用。

    類構造函數

   1.GregorianCalendar() 在具有默認語言環境的默認時區內使用當前時間構造一個默認的 GregorianCalendar

   2.GregorianCalendar(int year, int month, int dayOfMonth) ,還有重載的方法,參數順序有時間點的大到小順序 :年,月,日,時,分,秒。為具有默認語言環境的默認時區構造一個具有給定日期和時間設置的 GregorianCalendar。

GregorianCalendar gc = new GregorianCalendar(2016,11,06); //2016-11-06

  3.GregorianCalendar(Locale aLocale) 在具有給定語言環境的默認時區內構造一個基於當前時間的 GregorianCalendar。(包括一下兩個構造函數,在近期開發中基本沒有使用過,后面用了在更新吧)

  4.GregorianCalendar(TimeZone zone) 在具有默認語言環境的給定時區內構造一個基於當前時間的 GregorianCalendar

  5.GregorianCalendar(TimeZone zone, Locale aLocale)  在具有給定語言環境的給定時區內構造一個基於當前時間的 GregorianCalendar

  類方法

  GregorianCalendar類繼承於Calendar類,因此我們用的大多數方法都已經在上一篇介紹過了,這里只講述幾個重要方法。

   日歷的作用是提供某個時間點的年,月,日這些信息如何封裝好的GregorianCalendar類中獲取的,就是調用get方法,並使用Calendar中的部分常量,例:

  

public static void main(String[] args) {
        // TODO Auto-generated method stub
        
        GregorianCalendar now = new GregorianCalendar();
        int year = now.get(Calendar.YEAR);
        int month = now.get(Calendar.MONTH)+1;
        int day = now.get(Calendar.DAY_OF_MONTH);
        System.out.println("當前日期:"+year+"年 "+month+"月"+day+"日");//當前日期:2016年 11月6日
        ////設置新的時間
        now.set(Calendar.YEAR,1991);
        now.set(Calendar.MONTH,5);
        now.set(Calendar.DAY_OF_MONTH,20);
        System.out.println(now);
     //是不是看着下面這段有點眼熟,沒錯,在上一篇講過。
//java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=1991,MONTH=5,WEEK_OF_YEAR=46,WEEK_OF_MONTH=2,DAY_OF_MONTH=20,DAY_OF_YEAR=311,DAY_OF_WEEK=1,DAY_OF_WEEK_IN_MONTH=1,AM_PM=1,HOUR=8,HOUR_OF_DAY=20,MINUTE=1,SECOND=54,MILLISECOND=363,ZONE_OFFSET=28800000,DST_OFFSET=0] }

   也可以給當前時間增加天數,月份等,例:

now.add(Calendar.MONTH,2);//正數增加,負數減少,此句的意思是:增加三個月

  下面用該類寫一個顯示當前月的日歷

  

    public static void main(String[] args) {
        //創建當前日期對象
        GregorianCalendar now = new GregorianCalendar();
        
        //獲取當前月,當前天
        int nowMonth = now.get(Calendar.MONTH);
        int nowDay = now.get(Calendar.DAY_OF_MONTH);
        
        //設置為當前月的第一天
        now.set(Calendar.DAY_OF_MONTH,1);
        //獲知當月第一天是周幾
        int weekday = now.get(Calendar.DAY_OF_WEEK);
        
        //獲取當前地區星期的起始
        int firstDayOfWeek = now.getFirstDayOfWeek();
        
        //計算第一周顯示時的縮進
        int indent=0;
        while(weekday != firstDayOfWeek){
            indent++;
            now.add(Calendar.DAY_OF_MONTH, -1);
            weekday = now.get(Calendar.DAY_OF_WEEK);//這里減一天就會到上個月的最后一天,依次類推,找到和星期的起始對等的那天,腦補一下日歷,想看上個月的最后一天星期幾
            
        }
        
        //准備打印日歷的星期部分
        String[] weeknames = new DateFormatSymbols().getShortWeekdays();
        do{//一開始我是沒明白這個do循環,在上面的代碼中我們已經把日期減到當前地區的星期起始那一天,所以先循環一遍,這樣在加一圈就能正確打印七個星期的縮寫了
            System.out.printf("%6s",weeknames[weekday]);
            now.add(Calendar.DAY_OF_MONTH,1);
            weekday=now.get(Calendar.DAY_OF_WEEK);
            
        } while(weekday != firstDayOfWeek);
        
        System.out.println();
        
        for (int i = 0; i < indent; i++) {
            System.out.printf("%7s"," ");//打印縮進
        }
        
        now.set(Calendar.DAY_OF_MONTH, 1);//回歸到當月第一天
        
        do{
            int day=now.get(Calendar.DAY_OF_MONTH);
            System.out.printf("%6d", day);
            if(day == nowDay)
                System.out.print("*");
            else
                System.out.print(" ");
            now.add(Calendar.DAY_OF_MONTH, 1);
            weekday=now.get(Calendar.DAY_OF_WEEK);
            if(weekday == firstDayOfWeek)
                System.out.println();
        } while (now.get(Calendar.MONTH) == nowMonth);
    }

  

 

好了,這個類就介紹到這裏了,不知道這麽回事,輸入法突然變成繁體字了,我是正中的大陸人的啦,哈哈哈。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM