Instant
在时间线上的瞬间点,即一个时间的时间戳
Instant声明
public final class Instantimplements Temporal, TemporalAdjuster, Comparable<Instant>, Serializable {
这个类是不可变的和线程安全的。
Instant只有两个字段&#xff0c;一个是seconds&#xff0c;表示1970-01-01T00:00:00Z到现在的秒数&#xff0c;nanos表示秒数后的纳秒数。
private final long seconds;private final int nanos;
从描述&#xff0c;我们可以得知Instant当前表示的描述与
System.currentTimeMillis()是一样的&#xff0c;看我的测试Instant now2 &#61; Instant.now();System.out.println(now2.getEpochSecond());System.out.println(System.currentTimeMillis());
输出&#xff1a;
1592294701
1592294701325
可以看出两者的秒数是相当的&#xff0c;只是currentTimeMillis输出的是毫秒级别
API
静态方法
public static Instant now()&#xff1a;从系统时钟获取当前瞬间。
public static Instant ofEpochSecond(long epochSecond)&#xff1a;使用从1970-01-01T00&#xff1a;00&#xff1a;00Z的时代开始的秒数获得一个Instant的实例&#xff0c;纳秒设置为零。
public static Instant ofEpochMilli(long epochMilli)&#xff1a;获得的一个实例Instant从1970-01-01T00划时代使用毫秒&#xff1a;00&#xff1a;00Z。从指定的毫秒中提取秒和纳秒。
public static Instant parse(CharSequence text)&#xff1a;从一个文本字符串&#xff08;如2020-06-16T16:15:30.00Z&#xff09;获取一个Instant的实例。
例&#xff1a;
Instant parse &#61; Instant.parse("2020-06-16T16:15:30.00Z");
注意&#xff1a;秒之后的数值要用Z来表示&#xff0c;即0为0Z&#xff0c;16为16Z
非静态方法
public ValueRange range(TemporalField field)&#xff1a;获取指定字段的有效值的范围。一般使用的是ChronoField中的字段
public int get(TemporalField field)&#xff1a;获取指定字段的值&#xff0c;返回类型为int 。如果字段不支持&#xff0c;会抛出UnsupportedTemporalTypeException异常。Instant 还有一个getLong方法&#xff0c;用法一样&#xff0c;只是返回值为Long类型
例&#xff1a;
Instant parse &#61; Instant.parse("2020-06-16T16:15:30.666Z");System.out.println(parse.get(ChronoField.NANO_OF_SECOND));
public long getEpochSecond()&#xff1a;获取从1970-01-01T00&#xff1a;00&#xff1a;00Z开始到现在的秒数
public int getNano()&#xff1a;获取当前时间戳的纳秒值&#xff0c;为9位数
例&#xff1a;
&#64;Testpublic void test(){Instant now &#61; Instant.now();System.out.println(now.getEpochSecond());System.out.println(now.getNano());}输出1592314246
874488500
public Instant with(TemporalField field,long newValue)&#xff1a;将指定的字段设置为新值返回此瞬点的副本。
常用字段的有ChronoField类下的这4个
NANO_OF_SECOND &#xff1a;指定纳秒
MICRO_OF_SECOND &#xff1a;指定微妙
MILLI_OF_SECOND &#xff1a;指定毫秒
INSTANT_SECONDS &#xff1a;返回一个指定秒的Instant
例&#xff1a;
Instant parse &#61; Instant.parse("2020-06-16T16:15:30.666Z");Instant with &#61; parse.with(ChronoField.INSTANT_SECONDS, 50);System.out.println(parse.with(ChronoField.NANO_OF_SECOND, 10));System.out.println(with);
输出
2020-06-16T16:15:30.000000010Z
1970-01-01T00:00:50.666Z
public Instant plus(long amountToAdd,TemporalUnit unit)&#xff1a;返回添加指定数量的此瞬间的副本。
常用字段类ChronoUnit&#xff0c;那么在这里实现添加。 支持的字段的行为如下&#xff1a;
NANOS - 返回一个Instant &#xff0c;其中添加了Instant的纳秒数。 这相当于plusNanos(long) 。
MICROS - 返回一个Instant了指定微秒数的Instant。 这相当于plusNanos(long) &#xff0c;数量乘以1,000。
MILLIS -返回Instant添加了指定的毫秒数。 相当于plusNanos(long) &#xff0c;数量乘以1,000,000。
SECONDS - 返回一个Instant &#xff0c;加上指定的秒数。 这相当于plusSeconds(long) 。
MINUTES - 返回具有Instant分钟数的Instant。 这相当于plusSeconds(long) &#xff0c;数量乘以60。
HOURS -返回Instant与加入小时指定数目。 相当于plusSeconds(long) &#xff0c;数量乘以3,600。
HALF_DAYS - 返回一个Instant &#xff0c;加上指定的半天。 相当于plusSeconds(long) &#xff0c;数量乘以43.00&#xff08;12小时&#xff09;。
DAYS -返回Instant添加了天的指定数目。 相当于plusSeconds(long) &#xff0c;数量乘以86,400&#xff08;24小时&#xff09;。
例&#xff1a;
Instant instant &#61; Instant.parse("2020-06-16T16:15:30.666Z");
Instant result &#61; instant.plus(10, ChronoUnit.MINUTES);
public Instant plusSeconds(long secondsToAdd)&#xff1a;添加指定秒数
public Instant plusMillis(long millisToAdd)&#xff1a;添加指定毫秒数
public Instant plusNanos(long nanosToAdd)&#xff1a;添加指定纳秒数
public Instant minus(long amountToSubtract,TemporalUnit unit)&#xff1a;为Instant 的减去方法&#xff0c;还有minusSeconds等&#xff0c;都是减去相应单位数值
public ZonedDateTime atZone(ZoneId zone)&#xff1a;将此瞬间与时区相结合&#xff0c;创建一个ZonedDateTime 。
例&#xff1a;
System.out.println(Instant.now().atZone(ZoneId.systemDefault()));输出&#xff1a;
2020-06-16T21:53:12.520455100&#43;08:00[Asia/Shanghai]
public long toEpochMilli()&#xff1a;将此瞬间转换为1970-01-01T00&#xff1a;00&#xff1a;00Z到该瞬间的毫秒数。如果是当前时间点&#xff0c;则与System.currentTimeMillis()是一样的
例&#xff1a;
System.out.println(System.currentTimeMillis());
System.out.println(Instant.now().toEpochMilli());输出
1592315728420
1592315728422
public int compareTo(Instant otherInstant)&#xff1a;将此瞬间与指定的时刻进行比较。先比较秒数&#xff0c;秒数不相等&#xff0c;则返回相差秒数&#xff0c;秒数相等&#xff0c;则比较纳秒数
源码如下&#xff1a;
public int compareTo(Instant otherInstant) {int cmp &#61; Long.compare(seconds, otherInstant.seconds);if (cmp !&#61; 0) {return cmp;}return nanos - otherInstant.nanos;
}
public boolean isAfter(Instant otherInstant)&#xff1a;检查这个瞬间是否在指定的时间点之后。使用的是compareTo方法&#xff0c;大于0则表示在之后&#xff0c;返回true
源码&#xff1a;
public boolean isAfter(Instant otherInstant) {return compareTo(otherInstant) > 0;}
public boolean isBefore(Instant otherInstant):检查这个时刻是否在指定的时刻之前。相信大家应该知道源码使用的是什么方法了
public boolean equals(Object otherInstant)&#xff1a;检查这个瞬间是否等于指定的时刻。看一下源码方法&#xff0c;实现是不是十分简洁明了&#xff0c;值的学习
源码&#xff1a;
public boolean equals(Object otherInstant) {if (this &#61;&#61; otherInstant) {return true;}if (otherInstant instanceof Instant) {Instant other &#61; (Instant) otherInstant;return this.seconds &#61;&#61; other.seconds &&this.nanos &#61;&#61; other.nanos;}return false;}