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);
    }

  

 

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

 

转载于:https://www.cnblogs.com/gaofeng0527/p/6036203.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值