[Java] Instant类介绍与应用

背景

Instant是JKD1.8中新增的日期API,简要说下Java中日期APi的背景。
早在JDK1.0时代,JDK就包含了一个与时间相关的java.util.Date类,而因为其本身的缺陷,其大多数方法都在JDK1.1时代被新引入的与时间相关的Calendar类取代。而Calendar类并不比Date类好太多,其本身也有不少问题。譬如:

  • Calendar类是可变的,即可以直接修改内部储存的时间值,而日期时间这类属性应更类似于字符串String,具有不可变性才较为合理。
  • Date的起始年份都按1900年开始计算,而Date与Calendar的月份都以0开始计算,这与人的直觉和其他属性的计算方式有冲突,我们称其为偏移量。
  • 我们知道有个SimpleDateFormat类可以对日期进行格式化操作,而这个类只能直接操作Date类,对于后来加入并取代Date类大部分方法的Calendar类并不能直接操作。
  • 上述类都不是线程安全的。

对于第二点的代码解释:

        Date date = new Date(2077,6,1); 	// Fri Jul 01 00:00:00 CST 3977
        System.out.println(date);           // 年份从1990年开始计算:偏移量,月份从0开始,表示9月应该是8

注意存储的年份并不是2077,而是1900+2077;而月份也并不是6月,而是6-1月。这种操作逻辑就与人的直觉产生了冲突。

为了解决上述问题,JDK1.8中新增了许多与时间相关的新的API,Instant类就是其中之一。

用法

Instant类的功能类似于JDK1.8之前的util.Date类。

实例化

实例化方式比较特殊,不能直接通过new的方式进行实例化。需要调用now()方法,该方法返回一个记录当前格林威治标准时间的Instant对象的引用。

		Instant instant = Instant.now();
        System.out.println(instant);    // 按格林威治时间记录,即零时区:2020-06-27T01:47:37.253Z

常用方法

atOffset(ZoneOffest offest):

我们更习惯于使用北京时间,即东八区时间。因此需要对Instant实例化对象进行偏移量的设置。
通过调用ZoneOffest类的静态方法ofHours(int n),传入一个数值即可设置偏移的小时量。该方法返回一个OffsetDateTime对象的引用。

        // 按时区设置偏移量,
        OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8));// 设置偏移量为8
        System.out.println(offsetDateTime);	// 这个对象也可以直接打印:2020-06-27T09:47:37.253+08:00

toEpochMilli():

获取1970年1月1日至所记录时间的的毫秒数,类似于Date.getTime()。

        long l = instant.toEpochMilli();
        System.out.println(l);	// 1593222457253

ofEpocMilli(long epochMilli):

Instant类的静态方法,严格来说这也算实例化的一种方式:通过给定的毫秒数,获取Instant实例,类似于Date类的其一构造器。

        Instant instant1 = Instant.ofEpochMilli(l);
        System.out.println(instant1);	// 2020-06-27T01:47:37.253Z

Instant类比较简单,使用上也类似于JDK1.8之前的Date类,区别在于对Date类做了一定的改进以及一般搭配JDK1.8新增的其他几个日期API进行使用。

你可能感兴趣的:(Java)