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博客༺ཌ༈君☠纤༈ད༻同步发布

posted @ 2020-06-15 19:41  ༺ཌ༈君☠纤༈ད༻  阅读(445)  评论(0编辑  收藏  举报