JDK 8之前的日期时间API

2020-10-15 0 By admin
JDK8 之前的时间日期API 结构图
JDK8 之前的时间日期API 结构图

一、System类中获取时间戳的方法

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

import org.junit.Test;
public class DateTimeTest {
  @Test
  public void test1(){
    long time = System.currentTimeMillis();
    //返回当前时间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差。
    //称为时间戳
    System.out.println(time);
  }
}

二、Java中两个Date类的使用

2.1、java.util.Date类表示特定的瞬间,精确到毫秒

在 JDK 1.1 之前,类 Date 有两个其他的函数。
它允许把日期解释为年、月、日、小时、分钟和秒值。它也允许格式化和解析日期字符串。不过,这些函数的 API 不易于实现国际化。
从 JDK 1.1 开始,应该使用 Calendar 类实现日期和时间字段之间转换,使用 DateFormat 类来格式化和解析日期字符串。

public void test(){
//构造器一:Date():创建一个对应当前时间的Date对象
    Date date1 = new Date();
//toString():显示当前的年、月、日、时、分、秒
    System.out.println(date1.toString());   //Sat May 09 20:09:11 CST 2020
//getTime():获取当前Date对象对应的毫秒数。(时间戳)
    System.out.println(date1.getTime());  //1589026216998

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

2.2、java.sql.Date类

对应着数据库中的日期类型的变量

public void test(){
//创建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());
}

三、SimpleDateFormat 格式化时间展示

java.text.SimpleDateFormat 类是一个不与语言环境有关的方式来格式化和解析日期的具体类。它允许进行字符串文本类型和日期类型的相互转换。

public class DateTime {
  @Test
  public void testSimpleDateFormat() throws ParseException {
//实例化SimpleDateFormat
    SimpleDateFormat sdf = new SimpleDateFormat();

//格式化:日期---》字符串
    Date date = new Date();
    System.out.println(date);   //Sun May 10 16:34:30 CST 2020

    String format = sdf.format(date);
    System.out.println(format); //20-5-10 下午4:34

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

//*************按照指定的方式格式化和解析:调用带参的构造器*****************
//  SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyy.MMMMM.dd GGG hh:mm aaa");
    SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyy.MMMMM.dd GGG hh:mm aaa");
//格式化
    String format1 = sdf1.format(date);
    System.out.println(format1);  //02020.五月.10 公元 04:32 下午
//解析:要求字符串必须是符合SimpleDateFormat识别的格式(通过构造器参数体现),
//否则,抛异常
    Date date2 = sdf1.parse("02020.五月.10 公元 04:32 下午");
    System.out.println(date2);  //Sun May 10 16:32:00 CST 2020
  }
}

四、Calendar 日历类介绍

Calendar 类是一个抽象类,主用用于完成日期字段之间相互操作的功能。
它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。
瞬间可用毫秒值来表示,它是距历元(即格林威治标准时间 1970 年 1 月 1 日的 00:00:00.000,格里高利历)的偏移量。

4.1、构造方法

protected Calendar()
由于修饰符是protected,所以无法直接创建该对象。需要通过别的途径生成该对象。

4.2、getInstance

与其他语言环境敏感类一样,Calendar 提供了一个类方法 getInstance,以获得此类型的一个通用的对象。Calendar 的 getInstance 方法返回一个 Calendar 对象,其日历字段已由当前日期和时间初始化:
Calendar rightNow = Calendar.getInstance();//获得当前时间

4.3、Calendar类的成员方法

static Calendar getInstance() 使用默认时区和区域设置获取日历。通过该方法生成Calendar对象。
public void set(int year,int month,int date,int hourofday,int minute,int second) 设置日历的年、月、日、时、分、秒。
public int get(int field) 返回给定日历字段的值。所谓字段就是年、月、日等等。
public void setTime(Date date) 使用给定的Date设置此日历的时间。Date-Calendar
public Date getTime() 返回一个Date表示此日历的时间。Calendar-Date
abstract void add(int field,int amount) 按照日历的规则,给指定字段添加或减少时间量。
public long getTimeInMillies() 以毫秒为单位返回该日历的时间值。

注意:
获取月份时:一月是0,二月是1,以此类推,12月是11
获取星期时:周日是1,周二是2,。。。。周六是7

4.4、日历字段

YEAR:年 MINUTE:分 DAY_OF_WEEK_IN_MONTH:某月中第几周
MONTH:月 SECOND/MILLISECOND:秒/毫秒 WEEK_OF_MONTH:日历式的第几周
DATE:日 DAY_OF_MONTH:和DATE一样 DAY_OF_YEAR:一年的第多少天
HOUR_OF_DAY:时 DAY_OF_WEEK:周几 WEEK_OF_YEAR:一年的第多少周

具体时间字段:这里就不累赘了,从一月到十二月、从周一到周五
特殊的:AM_PM 返回1则表示是下午,返回0表示上午。

4.5、代码示例

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

//    System.out.println(calendar.getClass());  //class java.util.GregorianCalendar

    //2.常用方法
    //get()
    int days = calendar.get(Calendar.DAY_OF_MONTH);
    System.out.println(days);   //10
    System.out.println(calendar.get(Calendar.DAY_OF_YEAR)); //131,今天是这一年的131天

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

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

    //getTime():日历类---> Date
    Date date = calendar.getTime();
    System.out.println(date);   //Tue May 19 17:12:06 CST 2020

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

4.6、Calendar 设置时区的方法

当使用 Calendar 类库获取当前时间时,如果当前运行环境配置配置好,其获取的时间很可能为GMT(格林尼治标准时间)。

在更多地情况,我们应该是要获取北京时间的,所以使用 Calendar 应该怎么设置时区?

TimeZone.setDefault(TimeZone.getTimeZone("GMT+8"));
Calendar cal = Calendar.getInstance();
Date date = cal.getTime();

错误的代码

Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT+8"));
Date date = cal.getTime();