时间点

此类的对象表示时间线上的一点。可以理解为人类的绝对时间。

因为是时间线的一点,所以时间点可以比较大小,那么这个时间点的标准都是统一的(UTC时间);即这个时间点对于整个地球人们来说是唯一的,不是北京时间、也不是东京时间、而是世界时间。

与时间点相关的两个概念就是时间线时间的单位

一、时间线

时间点在时间线上(点在线上)。时间线上有三个重要的点:最大值点、最小值点、原点(时间不知道有没有尽头)。
在Java世界,时间线的末端分别是Instant.MAX和Instant.MIN;时间线的原点是Instant.EPOCH

(1)时间线上的原点

System.out.println(Instant.EPOCH);

结果:1970-01-01T00:00:00Z

(2)时间线的最大值

System.out.println(Instant.MAX);

结果:+1000000000-12-31T23:59:59.999999999Z

(3)时间线的最小值

System.out.println(Instant.MIN);

结果:-1000000000-01-01T00:00:00Z

二、时间的单位

年、月、日、时、分、秒都是时间的单位。
现在人们把控自己生活节奏已经到了分钟这个单位;而科技的进步要求把控我们的机器的时间单位是秒、毫秒、纳秒。

在时间线上,我们使用秒(s)作为时间点的单位。

1s(1秒)= 1000ms(1000毫秒) = 1000_000us(微妙)=1000_000_000ns(纳秒)

1day(天)=86400s(秒)=8640000ms(秒)

1year(年)= 365.2425day(天) = 31556952s(秒)= 31556952000ms(毫秒)

在Instant对象中,有一个long长度的值表示距离原点的长度(单位秒),

一个int长度的值表示纳秒(永远是正数,不会大于999_999_999;因为1000_000_000ns = 1s)。
源码:

/**
     * The number of seconds from the epoch of 1970-01-01T00:00:00Z.
     */
    private final long seconds;
    /**
     * The number of nanoseconds, later along the time-line, from the seconds field.
     * This is always positive, and never exceeds 999,999,999.
     */
    private final int nanos;

三、时间点的构造

(1)当前时间点

Instant now = Instant.now();
		System.out.println(now);
		System.out.println(now.getEpochSecond());
		System.out.println(now.getNano());
		
		System.out.println(now.toEpochMilli());

结果:

2019-04-18T08:04:29.633Z
1555574669
633000000
1555574669633

(2)根据距离原点的秒构造时间点

这个构造方法不够精准,无法到纳秒级。

①距离原点1秒
Instant now = Instant.ofEpochSecond(1L);
		System.out.println(now);
		System.out.println(now.getEpochSecond());
		System.out.println(now.getNano());
		
		System.out.println(now.toEpochMilli());

结果:

1970-01-01T00:00:01Z
1
0
1000
②距离原点-1秒
Instant now = Instant.ofEpochSecond(-1L);
		System.out.println(now);
		System.out.println(now.getEpochSecond());
		System.out.println(now.getNano());
		
		System.out.println(now.toEpochMilli());

结果:

1969-12-31T23:59:59Z
-1
0
-1000

(3)构造到纳秒级的时间点

源码:

public static Instant ofEpochSecond(long epochSecond, long nanoAdjustment) {
        long secs = Math.addExact(epochSecond, Math.floorDiv(nanoAdjustment, NANOS_PER_SECOND));
        int nos = (int)Math.floorMod(nanoAdjustment, NANOS_PER_SECOND);
        return create(secs, nos);
    }

这个方法有两个参数,第一个是秒,第二个是可以为正负的纳秒值。

Instant now = Instant.ofEpochSecond(5L,500L);
		System.out.println(now);
		System.out.println(now.getEpochSecond());
		System.out.println(now.getNano());
		
		System.out.println(now.toEpochMilli());
1970-01-01T00:00:05.000000500Z
5
500
5000
Instant now = Instant.ofEpochSecond(5L,-500L);
		System.out.println(now);
		System.out.println(now.getEpochSecond());
		System.out.println(now.getNano());
		
		System.out.println(now.toEpochMilli());
1970-01-01T00:00:04.999999500Z
4
999999500
4999

(4)构造到毫秒级的时间点

Instant now = Instant.ofEpochMilli(5500L);
		System.out.println(now);
		System.out.println(now.getEpochSecond());
		System.out.println(now.getNano());
		
		System.out.println(now.toEpochMilli());
1970-01-01T00:00:05.500Z
5
500000000
5500

(5)根据文本构造时间点

对字符串的格式有要求,字符串必须如同: 2007-12-03T10:15:30.00Z

Instant now = Instant.parse("1007-12-03T10:15:30.00Z");
		System.out.println(now);
		System.out.println(now.getEpochSecond());
		System.out.println(now.getNano());
		
		System.out.println(now.toEpochMilli());
1007-12-03T10:15:30Z
-30360318270
0
-30360318270000

四、时间点的比较

A.compareTo(B):A>B,return 1;A= B,return 0;A<B,return -1;

Instant datetime1 = Instant.parse("2007-12-03T10:15:30.00Z");
		Instant datetime2 = Instant.parse("2017-12-03T10:15:30.00Z");
		Instant datetime3 = Instant.parse("2019-12-03T10:15:30.00Z");
		
		
		System.out.println(datetime2.compareTo(datetime3));
		System.out.println(datetime2.compareTo(datetime2));
		System.out.println(datetime2.compareTo(datetime1));
		System.out.println(datetime2.isAfter(datetime2));
		System.out.println(datetime2.isBefore(datetime3));
-1
0
1
false
true

五、时间点的运算

(1)时间点加秒级、毫秒、纳秒

①原点加100000s

Instant plusSeconds = Instant.EPOCH.plusSeconds(100000L);
		System.out.println(plusSeconds);
		System.out.println(plusSeconds.getEpochSecond());
		System.out.println(plusSeconds.toEpochMilli());
		System.out.println(plusSeconds.getNano());
1970-01-02T03:46:40Z
100000
100000000
0

(2)时间点加任意时间单位

①原点加一百天

Instant plus100days = Instant.EPOCH.plus(100, ChronoUnit.DAYS);
		System.out.println(plus100days);
		System.out.println(plus100days.getEpochSecond());
		System.out.println(plus100days.toEpochMilli());
		System.out.println(plus100days.getNano());
1970-04-11T00:00:00Z
8640000
8640000000
0