Java Duration
外观
Java Duration[编辑 | 编辑源代码]
Duration是Java日期时间API(java.time包)中表示时间量或时间跨度的核心类,用于精确测量两个时间点之间的间隔(以秒和纳秒为单位)。与Period不同,Duration适合处理机器时间(如纳秒、秒),而非人类时间单位(如年、月)。
核心特性[编辑 | 编辑源代码]
- 测量基于时间的时间量(小时、分钟、秒、纳秒)
- 不可变且线程安全
- 最大存储范围:±146年(±1018纳秒)
- 精度可达纳秒级
- 实现接口
TemporalAmount
创建Duration对象[编辑 | 编辑源代码]
工厂方法[编辑 | 编辑源代码]
方法 | 描述 |
---|---|
Duration.ofDays(long)
|
创建指定天数的Duration(转换为秒) |
Duration.ofHours(long)
|
创建指定小时的Duration |
Duration.ofMinutes(long)
|
创建指定分钟的Duration |
Duration.ofSeconds(long)
|
创建指定秒的Duration |
Duration.ofMillis(long)
|
创建指定毫秒的Duration |
Duration.ofNanos(long)
|
创建指定纳秒的Duration |
// 创建2小时的Duration
Duration twoHours = Duration.ofHours(2);
System.out.println(twoHours); // 输出: PT2H
// 创建1500毫秒的Duration
Duration msDuration = Duration.ofMillis(1500);
System.out.println(msDuration); // 输出: PT1.5S
时间差计算[编辑 | 编辑源代码]
通过
between
方法计算两个时间点的间隔:
Instant start = Instant.now();
// 模拟耗时操作
Thread.sleep(1500);
Instant end = Instant.now();
Duration elapsed = Duration.between(start, end);
System.out.println("操作耗时: " + elapsed.toMillis() + "ms");
// 输出示例: 操作耗时: 1502ms
常用操作[编辑 | 编辑源代码]
时间单位获取[编辑 | 编辑源代码]
方法 | 返回类型 | 描述 |
---|---|---|
long | 总天数(24小时为1天) | ||
long | 总小时数 | ||
long | 总分钟数 | ||
long | 秒数部分 | ||
int | 纳秒部分(0-999,999,999) |
数学运算[编辑 | 编辑源代码]
Duration支持链式调用进行时间计算:
Duration duration = Duration.ofMinutes(30)
.plusSeconds(15) // 加15秒
.minusMillis(500); // 减500毫秒
System.out.println(duration); // 输出: PT30M14.5S
比较操作[编辑 | 编辑源代码]
Duration d1 = Duration.ofSeconds(10);
Duration d2 = Duration.ofMinutes(1);
System.out.println(d1.compareTo(d2)); // 输出: -1 (小于)
System.out.println(d1.isNegative()); // 输出: false
实际应用案例[编辑 | 编辑源代码]
性能测量[编辑 | 编辑源代码]
Instant processStart = Instant.now();
// 执行数据库查询
List<Record> records = database.query(...);
Instant processEnd = Instant.now();
Duration queryTime = Duration.between(processStart, processEnd);
if (queryTime.toSeconds() > 5) {
logger.warn("慢查询警告: 耗时 {} 毫秒", queryTime.toMillis());
}
定时任务控制[编辑 | 编辑源代码]
Duration timeout = Duration.ofSeconds(30);
Instant deadline = Instant.now().plus(timeout);
while (conditionNotMet()) {
if (Instant.now().isAfter(deadline)) {
throw new TimeoutException("操作超时");
}
// 继续尝试...
}
时间单位转换[编辑 | 编辑源代码]
Duration内部使用秒和纳秒存储,但提供多种单位转换:
Duration complex = Duration.ofSeconds(3675, 800_000_000); // 1小时1分15.8秒
System.out.println(complex.toHoursPart()); // 1 (小时部分)
System.out.println(complex.toMinutesPart()); // 1 (分钟部分)
System.out.println(complex.toSecondsPart()); // 15 (秒部分)
注意事项[编辑 | 编辑源代码]
- 不要将Duration用于日期计算(应使用Period)
- 跨越夏令时转换时,Duration仍保持精确的物理时间
- 序列化格式符合ISO-8601持续时间格式(如)
PT8H30M