JDK 8之前日期和时间类——System类, java.util.Date类,java.sql.Date类,SimpleDateFormat时间格式类,Calender时间操作类及JDK8说明

 

1.System类中的currentTimeMillis()  

返回当前时间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差,简称时间戳。

    @Test
    public void test1(){
        long time = System.currentTimeMillis();
        //返回时间戳
        System.out.println(time);
    }

 

2.java.util.Date类 

           |---java.sql.Date类

1.两个构造器的使用

>构造器一:Date():创建一个对应当前时间的Date对象

>构造器二:创建指定毫秒数的Date对象

2.两个方法的使用

>toString():显示当前的年、月、日、时、分、秒

>getTime():获取当前Date对象对应的毫秒数。(时间戳)

 

    @Test
    public void test2(){
        //构造器一:Date():创建一个对应当前时间的Date对象
        Date date1 = new Date();
        System.out.println(date1.toString());//Sat Feb 16 16:35:31 GMT+08:00 2019

        System.out.println(date1.getTime());//1550306204104

        //构造器二:创建指定毫秒数的Date对象
        Date date2 = new Date(1550306204104L);
        System.out.println(date2.toString());
    }

 

 3. java.sql.Date类

是.java.util.Date类 的子类。更多的用在数据库这一块。对应着数据库中的日期类型的变量,

>如何实例化

>如何将java.util.Date对象转换为java.sql.Date对象

    @Test
    public void test3(){
        //创建java.sql.Date对象
        java.sql.Date date3 = new java.sql.Date(35235325345L);
        System.out.println(date3);//1971-02-13

        //如何将java.util.Date对象转换为java.sql.Date对象
        	//情况一:子类转父类的,然后强转回子类
        Date date4 = new java.sql.Date(2343243242323L);
       	java.sql.Date date5 = (java.sql.Date) date4;
       	 //情况二:拿到父类生成的时间戳,放入子类构造器中
        Date date6 = new Date();
        java.sql.Date date7 = new java.sql.Date(date6.getTime());


    }

 

4.SimpleDateFormat 是对时间显示的格式进行调整的类。

 

SimpleDateFormat对日期Date类的格式化和解析,主体是两个操作:
1.1 格式化:日期 --->字符串
1.2 解析:格式化的逆过程,字符串 ---> 日期

2.SimpleDateFormat的实例化,重载的构造器,填入你想要的时间格式,输入对应时间。

@Test
    public void testSimpleDateFormat() throws ParseException {
        //实例化SimpleDateFormat:使用默认的构造器
        SimpleDateFormat sdf = new SimpleDateFormat();

        //格式化:日期 --->字符串
        Date date = new Date();
        System.out.println(date);

        String format = sdf.format(date);
        System.out.println(format);

        //解析:格式化的逆过程,字符串 ---> 日期
        String str = "19-12-18 上午11:43";
        Date date1 = sdf.parse(str);
        System.out.println(date1);

        //*************按照指定的方式格式化和解析:调用带参的构造器*****************
//        SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyy.MMMMM.dd GGG hh:mm aaa");
        SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        //格式化
        String format1 = sdf1.format(date);
        System.out.println(format1);//2019-02-18 11:48:27
        //解析:要求字符串必须是符合SimpleDateFormat识别的格式(通过构造器参数体现),
        //否则,抛异常
        Date date2 = sdf1.parse("2020-02-18 11:48:27");
        System.out.println(date2);
    }

 

5.java.util.Calendar 类,相当时间的操作类,对日期进行增删改查。

原本Date类中就有增删改查操作,但其中的方法都被废弃的。替代的是jdk1.1的Calendar 类。

   首先Calendar类是一个抽象类,实例化可以调用其静态方法Calender.getInstance();返回的是其子类 GregorianCalender.

 @Test
    public void testCalendar(){
        //1.实例化
        //方式一:创建其子类(GregorianCalendar)的对象
        //方式二:调用其静态方法getInstance()
        Calendar calendar = Calendar.getInstance();
//        System.out.println(calendar.getClass());

        //2.常用方法
        //get()
        int days = calendar.get(Calendar.DAY_OF_MONTH);
        System.out.println(days);
        System.out.println(calendar.get(Calendar.DAY_OF_YEAR));

        //set()
        //calendar可变性
        calendar.set(Calendar.DAY_OF_MONTH,22);
        days = calendar.get(Calendar.DAY_OF_MONTH);
        System.out.println(days);

        //add()
        calendar.add(Calendar.DAY_OF_MONTH,-3);
        days = calendar.get(Calendar.DAY_OF_MONTH);
        System.out.println(days);

        //getTime():日历类---> Date
        Date date = calendar.getTime();
        System.out.println(date);

        //setTime():Date ---> 日历类
        Date date1 = new Date();
        calendar.setTime(date1);
        days = calendar.get(Calendar.DAY_OF_MONTH);
        System.out.println(days);

    }

 

6. 就以jdk8之前上类,很难满足我们程序员对时间表达的需求。比如希望时间跟昼夜和四季有关等。

就以上类,还面临的问题有:

1.偏移性:Date中的年份是从1900开始的,而月份都是从0开始的。

2.格式化:格式化只对Date有用,Calendar则不行。时间各个类表示不同的操作,表现出它的复杂性了。

3.可变性:像日期和时间这样的类应该是不可变的。

4.她们不是线程安全的,不能处理闰秒等等......

他们都是说,对日期和时间的操作一直都是Java程序员最痛苦的地方之一

 

所以引入了jdk8中新日期时间的API 

java.time基础包

java.time.format格式解释包

java.time.chrono 对不同日历系统访问包

java.time.temporal 包括底层框架和扩展特性包

java.time.zone  包含时区支持类的包

 

说明一下:大多数开发者只会用到基础包和format包。因此,尽管更新了68公开类型,大多数开发着,大概只用到了其中的三分之一。

如:java.time.LocalDateTime,java.time.LocalDate,java.time.LocalTime;等等

 

一个程序员的自我修养和成长........

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章