跳转到内容

Java Duration

来自代码酷

模板:Note

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

比较操作[编辑 | 编辑源代码]

flowchart TD A[比较两个Duration] --> B[isZero] A --> C[isNegative] A --> D[compareTo]

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内部使用秒和纳秒存储,但提供多种单位转换:

总秒数=seconds+nanos109

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
    

模板:Tip

参见[编辑 | 编辑源代码]