zoukankan      html  css  js  c++  java
  • 廖雪峰Java7处理日期和时间-2Data和Calendar-2Calendar

    Calendar类

    历史上有许多纪年方法,其差异太大了。为了统一计时,通常采用格里高利日历。

    1.创建Calendar对象

    Calenda类是一个抽象类,所以不能使用构造器来创建Calendar对象。使用getInstance()方法来获取Calendar对象。这些方法根据TimeZone,Locale类来获取特定的Calendar,如果不指定TimeZone、Locale,则使用默认的TimeZone,Locale来创建Calendar。

        static void calenda2Date(){
            //Calendar与Date的互相转换
            //创建一个默认的Calendar对象
            Calendar c1 = Calendar.getInstance();
            //Calendar -> Date
            Date date = c1.getTime();
            //Date -> Calendar
            Calendar c2 = Calendar.getInstance();
            c2.setTime(date);
        }
    

    2.Calendar常用方法

    • void add(int field, int amount):根据日历的规则,为给定的日历字段添加或减去指定的时间量。field是Calendar的类变量,如Calendar.YEAR, Calendar.MONTH, Calendar等。
    • int get(int field):返回指定日历字段的值。
    • int getActualMaximum(int field):返回指定日历字段可能拥有的最大值。例如月,最大值是11.
    • int getActualMinimum(int field):返回指定日历字段可能拥有的最小值。流入月,最小值是0.
    • void roll(int field, int amount):与add()方法类似,区别在于加上amount后超出了该字段所能表示的最大范围时,也不会向上一个字段进位。
    • void set(int field, int value):将给定的日历字段设置为给定值。
    • void set(int year, int month, int date):设置Calendar对象的年、月、日的值。
    • void set(int year, int month, int data, int hourOfDay, int minute, int second):设置Calendar对象的年、月、日、时、分、秒6个字段的值。
        static void calendarOperator(){
            Calendar c1 = Calendar.getInstance();
            System.out.println("系统时间:"+date2String(c1.getTime()));
            c1.add(Calendar.MONTH,1);//月份+1
            System.out.println("月份+1:"+date2String(c1.getTime()));
            c1.roll(Calendar.MONTH,-2);//月份-2
            System.out.println("减2个月"+date2String(c1.getTime()));
            //Calendar中月的值是从0-11
    
            System.out.println("Calendar中月份的最小值:"+c1.getActualMinimum(Calendar.MONTH));
            System.out.println("Calendar中月份的最大值:"+c1.getActualMaximum(Calendar.MONTH));
            System.out.println("Calendar中月份值:"+c1.get(Calendar.MONTH)+"	实际月份:"+date2String(c1.getTime()).substring(5,7));
            System.out.println("年:"+c1.get(Calendar.YEAR)+"	Calendar月份:"+c1.get(Calendar.MONTH)+"日:"+c1.get(Calendar.DATE));
            //set
            c1.set(Calendar.MONTH,5);
            System.out.println(date2String(c1.getTime()));
            c1.set(2015,11,23);
            System.out.println(c1.getTime());
            c1.set(2014,11,30,14,22,35);
            System.out.println(date2String(c1.getTime()));
        }
        static String date2String(Date date){
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss Z");
            return sdf.format(date);
        }
    

    3.add与roll的区别

    add(int field, int amount)的规则:

    • 1.当被修改的字段超出它允许的范围时,会发生进位,即上一级字段也会增大。
    • 2.如果下一级字段页需要改变,那么该字段会修正到变化最小的值
        static String date2String(Date date){
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss Z");
            return sdf.format(date);
        }
        static void addRoll(){
            Calendar c1 = Calendar.getInstance();
            System.out.println("超出范围,会影响上一级字段");
            c1.set(2003,7,23,0,0,0);
            String s1 = date2String(c1.getTime());
            c1.add(Calendar.MONTH,6);
            String s2 = date2String(c1.getTime());
            System.out.println(s1+" 加上6个月->"+s2);
    
            System.out.println("超出范围,会影响下一级字段");
            c1.set(2003,7,31,0,0,0);
            String s3 = date2String(c1.getTime());
            c1.add(Calendar.MONTH,6);
            String s4 = date2String(c1.getTime());
            System.out.println(s3+" 加上6个月->"+s4);
        }
    
    ## 4.设置Calendar的容错性 setLenient()用于设置容错性,true开启,false关闭。 当传入一个不合法的参数,依然可以继续运行。如month范围0-11,设置为13 ```#java static void testLenient(){ Calendar c = Calendar.getInstance(); System.out.println("初始时间:"+date2String(c.getTime())); //容错默认开启,将月份设置为13,13-11=2,年份+1,得到的Month index是2,value是1 c.set(Calendar.MONTH,13); System.out.println("13-11,对应的MONTH值为1"+c.get(Calendar.MONTH)); System.out.println("月设置为13:"+date2String(c.getTime())); //关闭容错性,将月份设置为13,提示Exception in thread "main" java.lang.IllegalArgumentException: MONTH c.setLenient(false); c.set(Calendar.MONTH,13); System.out.println(date2String(c.getTime()));; } ```

    5.set()方法延迟修改

    调用set()修改日历字段,Calendar代表的时间不会立即修改,直到下次调用get(), getTime(), getTimeInMillis(), add(), roll()才会重新计算日历的时间。
    采用延迟修改的优势是多次调用set()不会触发多次不必要的计算

        static void testSet(){
            Calendar c1 = Calendar.getInstance();
            c1.set(2003,7,31);
            System.out.println("初始日期"+date2String(c1.getTime()));
            System.out.println("将月份设置为8");//9月31日不存在,调整为10月1日
            c1.set(Calendar.MONTH,8);
            System.out.println(date2String(c1.getTime()));
            System.out.println("将日期设置为5");
            c1.set(Calendar.DATE,5);
            System.out.println(date2String(c1.getTime()));
    
            Calendar c2 = Calendar.getInstance();
            c2.set(2003,7,31);
            System.out.println("初始日期"+date2String(c2.getTime()));
            System.out.println("将月份设置为8");
            c2.set(Calendar.MONTH,8);
            System.out.println("将日期设置为5");
            c2.set(Calendar.DATE,5);
            System.out.println(date2String(c2.getTime()));
        }
    
  • 相关阅读:
    Python冒泡算法和修改配置文件
    第五章:处理数据
    第四章:持久存储
    Python之打印99乘法表
    Python之编写登录接口
    Python之文件操作
    第三章:文件与异常
    FineUI 修改config表属性
    FineUI Grid中WindowField根据列数据决定是否Enalble
    表之间不同字段的数据复制
  • 原文地址:https://www.cnblogs.com/csj2018/p/10666868.html
Copyright © 2011-2022 走看看