Java中的即时示例
java.time.Instant类是Java 8中添加的新日期和时间API的一部分,该API代表时间线上的单个瞬时点。
Instant存储在两个字段中,它存储一个长整数(代表纪元秒)和一个int代表十亿分之一秒,该整数始终在0到999,999,999之间。纪元秒是从1970-01-01T00:00:00Z的标准Java纪元开始测量的,其中纪元后的时刻具有正值,而较早的时刻具有负值。要初始化这两个字段,Java Instant类中有一个私有的构造函数
/** * @param epochSecond the number of seconds from 1970-01-01T00:00:00Z * @param nanos the nanoseconds within the second, must be positive */ private Instant(long epochSecond, int nanos) { super(); this.seconds = epochSecond; this.nanos = nanos; }
即时类是不可变的,因此是线程安全的。由于已将其标记为最终的,因此无法进行扩展。
创建即时实例
Instant类没有任何公共构造函数来获取实例,我们将使用工厂方法来获取实例。
- now()–从系统时钟获取当前时刻。
Instant instant = Instant.now(); System.out.println(instant); //2019-11-07T05:21:04.464715600Z
- now(Clock clock)–从指定时钟获取当前时刻。
Instant instant = Instant.now(Clock.systemDefaultZone()); System.out.println(instant); //2019-11-07T05:36:01.210573Z
- ofEpochMilli(long epochMilli)–使用从1970-01-01T00:00:00Z的纪元开始的毫秒数获取Instant的实例。
Instant instant = Instant.ofEpochMilli(System.currentTimeMillis()); System.out.println(instant); //2019-11-07T05:39:27.853Z
- ofEpochSecond(long epochSecond)–使用从1970-01-01T00:00:00Z的纪元开始的秒数获取Instant实例。
Instant instant = Instant.ofEpochSecond(System.currentTimeMillis()/1000); System.out.println(instant); //2019-11-07T05:39:27.853Z
- ofEpochSecond(较长的时间,秒,较长的nanoAdjustment)–使用从1970-01-01T00:00:00Z的时间开始的秒数和秒的纳秒分数来获取Instant的实例。
Instant instant = Instant.ofEpochSecond(System.currentTimeMillis()/1000, 235); System.out.println(instant); //2019-11-07T05:40:55.000000235Z
- parse(CharSequence text)从文本字符串(例如2007-12-03T10:15:30.00Z)获取Instant实例。使用解析方法,我们可以将String转换为Instant。
Instant instant = Instant.parse("2019-10-28T11:35:15Z"); System.out.println(instant); //2019-10-28T11:35:15Z
从Instant获取纪元秒和纳秒值
由于Instant实例存储在两个字段中; epochSecond和nanos,因此有一些方法可以从java.time.Instant实例中提取这两个字段。
public class InsantExample { public static void main(String[] args) { Instant instant = Instant.parse("2019-10-28T11:35:15.245Z"); // epoch seconds System.out.println(instant.getEpochSecond()); // Nanos System.out.println(instant.getNano()); } }
输出:
1572262515 245000000
使用即时计算时间
有一些方法可以在Instant中添加或者减去日期和时间值。
减法
minus(long amountToSubtract,TemporalUnit单位)–返回此瞬间的副本,其中减去指定的数量。
minus(TemporalAmount amountToSubtract)–返回该瞬间的副本,其中减去指定的数量。
minusMillis(long millisToSubtract)–返回此瞬间的副本,其中减去指定的持续时间(以毫秒为单位)。
minusNanos(long nanosToSubtract)–返回此瞬间的副本,其中减去指定的持续时间(以纳秒为单位)。
minusSeconds(long secondsToSubtract)–返回此瞬间的副本,其中减去指定的持续时间(以秒为单位)。
public class InsantExample { public static void main(String[] args) { Instant instant = Instant.parse("2019-10-28T11:35:15.245Z"); System.out.println("Instant- " + instant); System.out.println("Instant second subtraction- " + instant.minusSeconds(15)); System.out.println("Instant millis subtraction- " + instant.minusMillis(2000)); System.out.println("Instant nanos subtraction- " + instant.minusNanos(45)); // Uses minus(long amountToSubtract, TemporalUnit unit) System.out.println("Instant days subtraction- " + instant.minus(10, ChronoUnit.DAYS)); // Uses minus(TemporalAmount amountToSubtract) System.out.println("Instant days subtraction- " + instant.minus(Period.ofDays(10))); System.out.println("Instant Hours subtraction- " + instant.minus(Duration.ofHours(3))); } }
输出:
Instant- 2019-10-28T11:35:15.245Z Instant second subtraction- 2019-10-28T11:35:00.245Z Instant millis subtraction- 2019-10-28T11:35:13.245Z Instant nanos subtraction- 2019-10-28T11:35:15.244999955Z Instant days subtraction- 2019-10-18T11:35:15.245Z Instant days subtraction- 2019-10-18T11:35:15.245Z Instant days subtraction- 2019-10-28T08:35:15.245Z
加法
plus(longToToTo,TemporalUnit单位)–返回此瞬间的副本,其中添加了指定的数量。
plus(TemporalAmount amountToAdd)–返回此瞬间的副本,其中添加了指定的数量。
plusMillis(long millisToAdd)-返回具有指定持续时间(以毫秒为单位)的此瞬间的副本。
plusNanos(long nanosToAdd)–返回此瞬间的副本,其中添加了指定的持续时间(以纳秒为单位)。
plusSeconds(long secondsToAdd)–返回此瞬间的副本,其中包含指定的持续时间(以秒为单位)。
public class InsantExample { public static void main(String[] args) { Instant instant = Instant.parse("2019-10-28T11:35:15.245Z"); System.out.println("Instant- " + instant); System.out.println("Instant second addition- " + instant.plusSeconds(15)); System.out.println("Instant millis addition- " + instant.plusMillis(2000)); System.out.println("Instant nanos addition- " + instant.plusNanos(45)); // Uses plus(long amountToAdd, TemporalUnit unit) System.out.println("Instant days addition- " + instant.plus(10, ChronoUnit.DAYS)); // Uses plus(TemporalAmount amountToAdd) System.out.println("Instant days addition- " + instant.plus(Period.ofDays(10))); System.out.println("Instant Hours addition- " + instant.plus(Duration.ofHours(3))); } }
输出:
Instant- 2019-10-28T11:35:15.245Z Instant second addition- 2019-10-28T11:35:30.245Z Instant millis addition- 2019-10-28T11:35:17.245Z Instant nanos addition- 2019-10-28T11:35:15.245000045Z Instant days addition- 2019-11-07T11:35:15.245Z Instant days addition- 2019-11-07T11:35:15.245Z Instant Hours addition- 2019-10-28T14:35:15.245Z
比较Java中的两个即时实例
compareTo(Instant otherInstant)–比较此时刻与指定时刻。如果小于通过的Instant实例,则返回负,否则返回正。
equals(Object otherInstant)–检查此瞬间是否等于指定的瞬间。如果另一个瞬间与此相等,则返回true。
isAfter(Instant otherInstant)–检查此时刻是否在指定时刻之后。
isBefore(Instant otherInstant)–检查此时刻是否在指定时刻之前。
public class InsantExample { public static void main(String[] args) { Instant instant1 = Instant.parse("2019-10-28T11:35:15.245Z"); System.out.println("Instant1- " + instant1); Instant instant2 = Instant.parse("2019-09-22T16:25:10.245Z"); System.out.println("Instant2- " + instant2); // Should return + value System.out.println("Instant comparison- " + instant1.compareTo(instant2)); System.out.println("Instanct Instances equal- " + instant1.equals(instant2)); System.out.println("Instant After- " + instant1.isAfter(instant2)); System.out.println("Instant Before- " + instant1.isBefore(instant2)); } }
输出:
Instant1- 2019-10-28T11:35:15.245Z Instant2- 2019-09-22T16:25:10.245Z Instant comparison- 1 Instanct Instances equal- false Instant After- true Instant Before- false