上一篇博文我们了解了 LocalDate
,LocalTime
和 LocalDateTime
,接下来我们了解另外三个 Instant
,Duration
和 Period
。
我们的思维习惯上以年月日时分秒的方式来理解日期和时间,但计算机却无法理解,更简单来说他更加容易接受的就是时间戳。
java.time.Instant
相当于java.util
的Date,表示某个瞬时点,它是以Unix元年时间(传统的设定为UTC时区1970年1月1日午夜时分)开始所经历的秒数进行计算。
Instant
的创建方式与前面提及的Local*
类似,只不过其传入的参数是距离Epoch的秒数或纳秒值。且相关的操作方法也极其形似。
Instant.now(); // 2019-08-09T06:12:06.981Z
Instant.ofEpochMilli(2356); // 1970-01-01T00:00:02.356Z
需要特别强调一点, Instant
的设计初衷是为了便于机器使用。它包含的是由秒及纳秒所构成的数字。所以,它无法处理那些我们非常容易理解的时间单位。比如下面这段语句:
int day = Instant.now().get(ChronoField.DAY_OF_MONTH);
它会抛出下面这样的异常:
java.time.temporal.UnsupportedTemporalTypeException: Unsupported field:DayOfMonth
Java 1.8 对Date进行了增强,从而可以实现Date
与Instant
之间的转换:
Date.toInstant()
:将Date转换为InstantDate.from(Instant)
:将指定的Instant转换为Date而LocalDateTime
也提供了相应的方法来实现与Instant
之间的转换:
ofInstant
(Instant instant, ZoneId zone):通过指定的Instant和ZoneId来创建LocalDateTime实例,其实也就是根据时间戳和时区来创建。toInstant
(ZoneOffset offset):将此日期时间转换为InstantDuration
和 Period
都是用来表示两个时间量之间的差值,不同点在于Duration
是基于时间值,而 Period
是基于日期值。
二者都提供了四种静态工厂方法来创建实例:
Duration
或 Period
生成
TemporalAmount
,其就是Duration
和 Period
的共同的接口P
Duration
解析的字符串格式为PnDTnHnMn.nS
T
必须出现在时分秒第一次出现之前,且后面至少得跟着一个"P2DT3H4M"
⇒ “PT51H4M”
Period
解析的字符串格式为:PnYnMnD
## Duration解析示例
"PT20.345S" -- parses as "20.345 seconds"
"PT15M" -- parses as "15 minutes" (where a minute is 60 seconds)
"PT10H" -- parses as "10 hours" (where an hour is 3600 seconds)
"P2D" -- parses as "2 days" (where a day is 24 hours or 800 seconds)
"P2DT3H4M" -- parses as "2 days, 3 hours and 4 minutes"
"P-6H3M" -- parses as "-6 hours and +3 minutes"
"-P6H3M" -- parses as "-6 hours and -3 minutes"
"-P-6H+3M" -- parses as "+6 hours and -3 minutes"
## Period解析示例
"P2Y" -- Period.ofYears(2)
"P3M" -- Period.ofMonths(3)
"P4W" -- Period.ofWeeks(4)
"P5D" -- Period.ofDays(5)
"P1Y2M3D" -- Period.of(1, 2, 3)
"P1Y2M3W4D" -- Period.of(1, 2, 25)
"P-1Y2M" -- Period.of(-1, 2, 0)
"-P1Y2M" -- Period.of(-1, -2, 0)
同样的,类库也为Duration
和 Period
提供了相应的**minus*
** 、plus*
和 with*
方法来对其进行 增、减 和 修改操作,不仅如此还相对的多出了如下操作:
我们也可以通过相关的 get*
方法来获取其相关内容:
Duration d=Duration.parse("P2DT3H4M");
d.get(ChronoUnit.SECONDS);
d.getSeconds();
d.get(ChronoUnit.NANOS);
d.getNano();
Period p=Period.parse("P1Y2M3W4D");
p.get(ChronoUnit.YEARS);
p.getYears();
p.get(ChronoUnit.MONTHS);
p.getMonths();
p.get(ChronoUnit.DAYS);
p.getDays();
其它常用方法:
Temporal
对象。Duration
或 Period
的几个单位中是否有一个是负数的。Duration
或 Period
的几个单位中是否都为0。因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- awee.cn 版权所有 湘ICP备2023022495号-5
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务