Java 新时间日期API(五)Instant
前言:
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类,记录在此方便以后查阅。