Java 8 新的 Date-Time API 吸取了 Joda-Time 的精髓,所有类不可修改。
新的 java.time 包涵盖了所有处理日期,时间,日期/时间,时区,时刻(Instant),过程(during)与时钟(clock)的操作。替换 Calendar 和 Date 类。
Java的 Date 和 Time API 规范要求 Java 时间尺度为:
- 每天 86400 秒
- 每天正午与官方时间精确匹配
- 在其他时间点上,以精确定义的方式与官方时间接近匹配
1 Instants
Instant(时刻,时间点)表示时间线上的某个点,时间线的原点被设为“新纪元”——本初子午线的 1970 年 1 月 1 日午夜。
精确到纳秒,Instant.MIN 可追溯 10 亿年,Instant.MAX 是公元 10 亿年的 12 月 31 日。
当前时刻
Instant.now() 获取当前时刻,可做时间戳
2 Duration
Duration(时间区间)是两个时刻之间的时间量。
因为纳秒级别超出一个 long 型长度,秒数存在一个 long 中,纳秒数存在一个 int 中。
2.1 传统度量
可以使用 toNanos、toMillis、getSeconds、toMinutes、toHours 和 toDays 转换为传统时间度量单位。
2.2 时间差
between(start,end) 获取两时刻的时间差
Instant start = Instant.now();
runAlgorithm();
Instant end = Instant.now();
Duration timeElapsed = Duration.between(start, end);
long millis = timeElapsed.toMillis();
2.3 计算
如果要计算精确到纳秒级,需要整个 Duration 的存储内容
方法 | 描述 |
---|---|
plus, minus | 在当前 Instant 或 Duration 上加减一个 Duration |
plus(Nanos,Millis,Seconds), minusXXX | 在当前 Instant 或 Duration 上加减指定时间单位的数值 |
plus(Minutes,Hours,Days), minusXXX | 当前 Duration 上加减指定时间单位的数值 |
multipliedBy, dividedBy, negated | 当前 Duration 上乘、除、减去给的 long |
isZero, isNegative | 检查当前 Duration 是否 0 或负值 |