• Java高级编程--JDK8之前日期时间API


    在开发过程中我们常常会碰到要处理时间的需求,本篇博客将介绍在JDK8之前日期时间API的使用。


    目录:

    ☍ java.lang.System类

    ☍ java.util.Date类和子类java.sql.Date类

    ☍ SimpleDateFormat类

    ☍ Calendar日历类


    ▾ java.lang.System类

    System类提供的public static long currentTimeMillis()用来返回当前时
    间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差。

    ☄ 此方法适于计算时间差(时间戳)。

    计算世界时间的主要标准有:

      ☃ 此方法适于计算时间差(时间戳)。

      ☃ 此方法适于计算时间差(时间戳)。

      ☃ 此方法适于计算时间差(时间戳)。

    Long thisTime = System.currentTimeMillis();
    System.out.println(thisTime);   //Thu Jun 11 08:53:39 CST 2020对应的时间差1591836819476  
    

    ▾ java.util.Date类和子类java.sql.Date类

    表示特定的瞬间,精确到毫秒

    Date()构造器:

      ➣ Date():使用无参构造器创建的对象可以获取本地当前时间。

      ➣ Date(long millis):指定毫秒数(时间戳)的日期时间对象。

      ➣ Date(int year, int month, int day):指定年月日,year从1900年开始,月份从0开始,已过时。

    Date类常用方法:

      ➣ getTime():返回自 1970年1月1日 00:00:00 GMT以来的时间戳,等同于System.currentTimeMillis()。

      ➣ toString():把此 Date 对象转换为默认格式的字符串如:Mon Jun 13 09:40:30 CST 2020。

    /**java.util.Date的日期类*/
    //空参为默认当前时间对象
    Date date1 = new Date();
    //date.toString()方法返回的是当前日期和时间信息
    System.out.println("date1:" + date1.toString()); //Thu Jun 11 08:48:39 CST 2020
    //时间戳/毫秒数  等同于System.currentTimeMillis()
    System.out.println("date1:" + date1.getTime());  //1591836915818
    //Long l参数的构造器   指定时间戳(毫秒数)日期对象
    Date date2 = new Date(1591836829476L);
    System.out.println("date2:" + date2.toString()); //Thu Jun 11 08:53:49 CST 2020
    

    java.sql.Date类与java.util.Date类的转换:

    由于java.sql.Date是java.util.Date的子类,所以这两个类的创建方式和大多数方法基本相同,需要注意sql.Date类无空参构造器,使用 new Date(Long millis)进行实例化操作

    java.sql.Date类对应着数据库中的日期类型的变量,多在与数据库交互时使用,其格式与java.util.Date有所区别,格式如:2020-06-11

    ✥ sql.Date<-->util.Date的转换

       ➣ 向上转型(自动) java.util.Date date = new java.sql.Date(Long millis);

    ✥ util.Date-->sql.Date

       ➣ 通过时间戳/毫秒数转换 java.sql.Date date = new java.sql.Date(new java.util.Date().getTime());

    错误方式:不能强制向下转型 报ClassCastException错误 java.sql.Date date = (java.util.Date) new java.util.Date();

    /**sql.Date与util.Date的转换*/
    //sql.Date转为util.Date
    //sql.Date-->sql.Date   自动向上转型   注意sql.Date的构造器必须有参数Long millis
    Date date5 = new java.sql.Date(1591836915818L);
    System.out.println("date5:" + date5);
    //util.Date-->sql.Date  不能强制向下转型  报ClassCastException错误
    //java.sql.Date date6 = (java.sql.Date)date1;
    // System.out.println("date6:" + date6);
    //util.Date-->sql.Date  通过时间戳(毫秒数转换)
    java.sql.Date date7 = new java.sql.Date(new Date().getTime());
    System.out.println("date7:" + date7);
    

    ▾ SimpleDateFormat类

    Date类的API不易于国际化,大部分被废弃了,java.text.SimpleDateFormat
    类是一个不与语言环境有关的方式来格式化和解析Date日期的具体类。

    SimpleDateFormat类的实例化操作:

      ➣ new SimpleDateFormat():使用无参构造器创建默认格式的SimpleDateFormat对象。

      ➣ new SimpleDateFormat(String pattern):使用String pattern构造器创建自定义格式的SimpleDateFormat对象。

    SimpleDateFormat类的格式化和解析操作:

      ➣ public String format(Date date) :方法格式化时间对象date,返回字符串

      ➣ public String format(Date date) : public Date parse(String source):将字符串按SimpleDateFomat的格式转换为Date对象,返回Date类对象。

    SimpleDateFormat类的格式化和解析操作:

    字母 日期或时间元素 表示 示例
    G Era年代标志符 Text 公元; AD
    y Year 2020; 20
    M 年中的月份 Month June; Jun; 06
    w 年中的周数 Number 27
    W 月份中的周数 Number 3
    D 年中的天数 Number 169
    d 月份中的天数 Number 14
    F 月份中的星期 Number 3
    E 星期的天数 Text TuseDay; Tue;星期四
    a Am/Pm标记 Text PM; 下午
    H 小时(0-23) Number 0
    k 小时(1-24) Number 24
    K 小时(0-11) Number 0
    h 小时(1-12) Number 12
    m 分钟 Number 30
    s Number 59
    S 毫秒(1秒=1000毫秒) Number 698
    z 时区 General time zone PST; GMT-08:00
    Z 时区 RFC 822 time zone -0800
    //空参实例化SimpleDateFormat
    SimpleDateFormat sdf = new SimpleDateFormat();
    
    //格式化: 日期Date对象 ---> 字符串
    Date date1 = new Date();
    System.out.println(date1);   //Fri Jun 12 16:45:34 CST 2020
    String time1 = sdf.format(date1);
    System.out.println(time1);  //20-6-12 下午4:45
    
    //解析:格式化的逆过程 字符串 ---> 日期Date对象   默认方式如:20-6-12 下午4:45
    String time2 = "20-11-12 下午4:45";
    Date date2 = sdf.parse(time2);
    //Date date3 = sdf.parse("2020-06-12");// 传入的字符串格式与SimpleDateTime格式不同 ParseException异常
    System.out.println(date2);
    
    //自定义实例化SimpleDateFormat
    SimpleDateFormat sdf1 = new SimpleDateFormat("G M yyyy-MM-dd M E a HH:mm:ss:SS z");
    System.out.println(sdf1.format(date1));  //公元 6 2020-6-12 6 星期五 下午 17:37:21:548 CST
    //指定的什么格式,解析时传入的参数就需要是什么格式,否则会报ParseException异常
    Date date3 = sdf1.parse("公元 6 2020-6-12 6 星期五 下午 17:37:21:548 CST");
    System.out.println(date3);
    

    ▾ Calendar日历类

    Calendar是一个抽象基类,主用用于完成日期字段之间相互操作的功能。

    Calendar实例化操作:

      ➣ 使用Calendar.getInstance()方法(常用)。

      ➣ 调用它的子类GregorianCalendar的构造器。

    Calendar类常用方法:

      ➣ public int get(int get filed):获取指定信息,如YEAR、MONTH、DAY_OF_WEEK、HOUR_OF_DAY、MINUTE、SECOND。

      ➣ public void set(int field, int value):与get(xxx)对应,设置Calendar相应变量的值,如YEAR、MONTH、DAY_OF_WEEK、HOUR_OF_DAY、MINUTE、SECOND。

      ➣ public void add(int field, int amount):将对应信息加值,负数为减值。

      ➣  public final Date getTime():将calendar对象转换为Date对象,返回Date对象。

      ➣ public long getTimeInMillis():将calendar对象转换为Long型毫秒数。

      ➣ public final void setTime(Date date):将calendar对象设置为对应的Date对象(对原对象的操作)。

      ➣ public void setTimeInMillis(long millis):将calendar对象设置为对应的毫秒数时间(对原对象的操作)。

    ✦ 获取月份时:一月是0,二月是1,以此类推,12月是11

    ✦ 获取星期时:周日是1,周二是2 ......周六是7

    public void testCalendar(){
        /*1、实例化Calendar   abstract类   通过子类创建对象
             方式一:创建子类(GregorianCalendar)
             方式二:调用其静态方法getInstance()  常用
        */
        Calendar calendar = Calendar.getInstance();
        System.out.println(calendar.getClass());  //也是通过子类GregorianCalendar实现
    
        /*2、Calendar类常用方法
            calendar.get(xxx)      获取常用信息,如年、月、日、周等
            calendar.set(xxx,value)  与get()对应,设置信息
            calendar.add(xxx,int value)  将对应信息加值,负数为减值
            calendar.getTime()   将calendar对象转换为Date对象,返回Date
            calendar.getTimeMillis()  获取毫秒数,返回Long
            calendar.setTime(Date date)   将Date对象值设置到calendar对象中
            calendar.setTimeInMillis(Long millis)   将毫秒数值设置到calendar对象中
         */
    
        //get(xxx)   Calendar定义了很多static变量,如今天是这个月的第几天,年份,月等
        // 通过get()可以获取到这些信息
        System.out.println("--------get()------");
        int month = calendar.get(Calendar.MONTH);
        System.out.println("Calendar.MONTH:"+month);  //月份下标从0开始
        System.out.println("Calendar.DAY_OF_MONTH:" + calendar.get(Calendar.DAY_OF_MONTH));
    
        //set(xxx,value)  与get(xxx)对应,设置Calendar相应变量的值
        System.out.println("---------set()---------");
        calendar.set(Calendar.DAY_OF_WEEK,1);
        //注意:一周中的第几天从周日下标为1开始到周六为7结束
        System.out.println("set(Calendar.DAY_OF_WEEK,1)后Calendar.DAY_OF_MONTH:" + calendar.get(Calendar.DAY_OF_MONTH));
    
        //add()
        System.out.println("---------add()--------");
        calendar.add(Calendar.DAY_OF_WEEK,6);
        System.out.println("在原来的基础上加6天:" + calendar.get(Calendar.DAY_OF_MONTH));  //周六
        calendar.add(Calendar.YEAR,-1);   //负数相当于减
        System.out.println(calendar.get(Calendar.YEAR)); //2019
    
        //getTime()   Calendar类  -->  Date类
        System.out.println("--------getTime()--------");
        Date date1 = calendar.getTime();
        System.out.println(date1);
    
        //getTimeMillis()  获取毫秒数,相当于Date.getTime() 和 System.currentTimeMillis()
        System.out.println("--------getTimeMillis()--------");
        Long millis = calendar.getTimeInMillis();
        System.out.println(millis);
    
        //setTime(Date date)   与getTime()对应  Date类 --> Calendar类
        System.out.println("--------setTime()--------");
        Date date2 = new Date();
        calendar.setTime(date2);
        System.out.println(calendar.get(Calendar.YEAR));  //2020
    
        //setTimeInMillis(Long millis)
        System.out.println("--------setTimeInMillis()--------");
        calendar.setTimeInMillis(millis);
        System.out.println("当前分钟:"+calendar.get(Calendar.MINUTE));
    }
    

    JDK8新增的日期时间API↷传送门


    本博客与CSDN博客༺ཌ༈君☠纤༈ད༻同步发布

  • 相关阅读:
    LeetCode 172:阶乘后的零
    Ubuntu12.04更新出现 The system is running in low-graphics mode解决方法
    不加参数的存储过程
    PCC-S-02201, Encountered the symbol "DB_USER_OPER_COUNT"
    该思考
    关于export环境变量生存期
    会话临时表 ORA-14452
    如何创建守护进程--及相关概念
    2014年10月末
    6个月
  • 原文地址:https://www.cnblogs.com/asio/p/13137026.html
Copyright © 2020-2023  润新知