Java中的即时示例

时间:2020-01-09 10:35:17  来源:igfitidea点击:

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类没有任何公共构造函数来获取实例,我们将使用工厂方法来获取实例。

  1. now()–从系统时钟获取当前时刻。
Instant instant = Instant.now();
System.out.println(instant); //2019-11-07T05:21:04.464715600Z
  1. now(Clock clock)–从指定时钟获取当前时刻。
Instant instant = Instant.now(Clock.systemDefaultZone());
System.out.println(instant); //2019-11-07T05:36:01.210573Z
  1. 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
  1. 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
  1. 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
  1. 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