JDK8之时间线对象Instant

JDK8中Instant

前言

如果是 JDK8 的应用,可以使用 Instant 代替 Date,LocalDateTime 代替 Calendar, DateTimeFormatter 代替 SimpleDateFormat,官方给出的解释:simple beautiful strong immutable thread-safe。

Instant详解

JDK8之时间线对象Instant_第1张图片

  • FunctionalInterface
    主要用在Lambda表达式和方法引用(实际上也可认为是Lambda表达式)上。类似于泛型的用途,可以在编译期帮我们检查是否符合函数式编程的规范。
  • TemporalAccessor
    框架级接口定义对时态对象的只读访问,例如日期、时间、偏移量或这些对象的某些组合。这是日期、时间和偏移对象的基本接口类型。
  • Comparable
    这个接口对实现它的每个类的对象强制执行总排序。这种排序称为类的自然排序,类的compareTo方法称为其自然比较方法.
  • TemporalAdjuster
    调整时间对象的策略。调节器是修改时态对象的关键工具。它们的存在是为了使调整过程具体化,允许按照策略设计模式采用不同的方法。例如,可以设置避免周末的日期的调节器,或者将日期设置为一个月的最后一天。
  • Temporal
    它继承了TemporalAccessor,再次基础上扩展了一些接口。
  • Serializable
    类的可序列化性是由实现java.io.Serializable接口启用的。不实现此接口的类将不会有任何状态序列化或反序列化。可序列化类的所有子类型本身都是可序列化的。序列化接口没有方法或字段,只用于标识可序列化的语义。
  • Instant
    时间线上的瞬时点。这个类对时间线上的一个瞬时点进行建模。这可能用于记录应用程序中的事件时间戳。

首先Instant.java的API JDK8 Instant API,可以通过API知道一些基础的知识。所谓的 Instant 类代表的是某个时间(有点像 java.util.Date),它是精确到纳秒的(而不是象旧版本的Date精确到毫秒)。如果使用纳秒去表示一个时间则原来使用一位Long类型是不够的,需要占用更多一点的存储空间,实际上其内部是由两个Long字段组成,第一个部分保存的是自标准Java计算时代(就是1970年1月1日开始)到现在的秒数,第二部分保存的是纳秒数(永远不会超过999,999,999)。静态方法:JDK8之时间线对象Instant_第2张图片
测试案例:

package vip.wulang.springdatajpa;

import org.junit.Test;

import java.time.Instant;

/**
 * @author CoolerWu on 2018/11/12.
 * @version 1.0
 */
public class InstantTest {
    @Test
    public void justTest() {
        // 从系统时钟获得当前时间
        // 这将查询系统UTC时钟以获得当前即时消息
        // 使用这种方法将阻止使用备用时间源进行测试,因为时钟实际上是硬编码的
        // 返回当前时间对象
        Instant instant = Instant.now();

        long currentLong = 0L;

        // 获取时间戳(单位:秒)
        System.out.println((currentLong = instant.getEpochSecond()));

        // 获得当前时间的年月日格式,toString()可以省略
        System.out.println(instant.toString());

        // 根据时间戳构建一个Instant对象
        // 从1970-01-01T00:00:00Z的epoch中获取一个瞬间使用秒的实例
        // nanos被设为零
        System.out.println(Instant.ofEpochSecond(currentLong).toString());
        
        // 由于时间戳单位秒,所以转换成毫秒需要乘以1000
        System.out.println(Instant.ofEpochMilli(currentLong * 1000).toString());

        // 根据时间戳构建一个Instant对象
        // 从1970-01-01T00:00:00Z的epoch中获取一个瞬间使用秒的实例
        System.out.println(Instant.ofEpochSecond(currentLong, instant.getNano()).toString());

        // 字符串必须在UTC中表示有效的瞬间
        // 从文本字符串中获取Instant实例,例如,字符串必须在UTC中表示有效的瞬间,并使用datetimeformat.iso_instant解析
        // getEpochSecond() 获取秒数
        // getNano() 获取纳秒数
        System.out.println(Instant.parse("2007-12-03T10:15:30.44Z").getEpochSecond());
        System.out.println(Instant.parse("2007-12-03T10:15:30.44Z").getNano());
    }
}

结果

JDK8之时间线对象Instant_第3张图片

总结

  官方给出的解释:simple beautiful strong immutable thread-safe。线程安全并且不可变,类似于String和8个包装类。相比于Date类来说,他可能更加方便,也不需要去捕获什么异常,但是也要注意字符串转换的时间一定要符合2007-12-03T10:15:30.44Z这种格式才可以,不然会抛出异常。

你可能感兴趣的:(JDK源码,java,jdk8)