Java 新时间日期API(五)Instant

java Jul 28, 2018

前言:

Instant代表了时间上的某一点,一般我们管它叫时间戳,它代表了时间的瞬时概念是Java提供的代表时间的类中的“最小单位”,所以也是最精准的,我们可以获取到nano seconds级别的时间。时间戳不表示任何当地时间如果想要获取当地时间需要加上时区。

Instant

Instant是不可变,线程安全类。内部计算时间时候,使用的是unix time也就是从1970-01-01T00:00:00Z开始算起(为什么从这天开始参考这个讨论)。可接受的字符串格式参照:2007-12-03T10:15:30.00Z

初始化

和其他时间类类似,Instant是不可变的,也没办法new获取对象。Instant为我们提供了如下工厂方法获取实例对象。

Instant instant = Instant.now(); //获取当前时间戳
Instant clockInstant = Instant.now(clock); // 通过时钟获取时钟的当前时间戳 等价于clock.instant()
Instant epochSecondInstant = Instant.ofEpochSecond(System.currentTimeMillis() / 1000); //通过传入秒数初始化Instant
Instant epochMilliInstant = Instant.ofEpochMilli(System.currentTimeMillis());//通过传入毫秒数初始化Instant
Instant parseInstant = Instant.parse("2018-07-24T10:51:58.963Z");//Instant接受两种格式的字符串参照 2018-07-24T10:51:58.963Z,2018-07-24T10:51:59Z

使用with方法修改属性

Instant的with方法支持修改的参数如下:

  • ChronoField.MILLI_OF_SECOND
  • ChronoField.MICRO_OF_SECOND
  • ChronoField.NANO_OF_SECOND
  • ChronoField.INSTANT_SECONDS
    eg:
Instant instant = Instant.now();
instant.with(ChronoField.MILLI_OF_SECOND, 12);//修改当前毫秒数为12。

增加和减少时间

增加时间:

1.plus方法支持的增加的属性参数;

  • ChronoUnit.NANOS
  • ChronoUnit.MICROS
  • ChronoUnit.MILLIS
  • ChronoUnit.MICROS
  • ChronoUnit.SECONDS
  • ChronoUnit.HOURS
  • ChronoUnit.HALF_DAYS
  • ChronoUnit.DAYS
    eg:
 instant.plus(1, ChronoUnit.HOURS); //添加1小时

2.plus支持直接添加秒数,毫秒数,纳秒数

instant.plusSeconds(1000);
instant.plusMillis(1000);
insatnt.plusNanos(1000);

减少时间:

减少时间的方法参数和增加方法类似只是名字换成了minus

比较的方法

比较的方法可以帮助我们快速区分两个Instant在时间线上的前后关系

// 结果小于0 -> instant小于otherInstant
// 结果等于0 -> instant等于otherInstant
// 结果大于0 -> instant大于otherInstant
final int result = instant.compareTo(otherInstant); 
//直接比较的方式比较方便
instant.isAfter(otherInstant);
instant.isBefore(otherInstant);

总结

时间戳Instant类的可以在复杂场景中替换System.currentTimeMillis(),方便我们的开发工作。通过这篇文章总结如何使用Instant类,记录在此方便以后查阅。

zzx

There is my place for writing,coding and reading