使用 chronounit.hours.between() 方法可以直接计算两个时间对象之间的间隔小时数。只需传入起始时间和结束时间作为参数,该方法会自动处理跨天、夏令时等复杂情况并返回一个长整型的数值结果。

LocalDateTime 计算普通时间差
对于没有时区信息的本地时间,直接使用 LocalDateTime 配合 ChronoUnit 是最简单的做法。将两个时间点传给 between 方法,得到的结果是精确到小时的整数部分,忽略不足一小时的分钟和秒。

import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
public class Main {
public static void main(String[] args) {
LocalDateTime start = LocalDateTime.of(2023, 10, 1, 10, 0, 0);
LocalDateTime end = LocalDateTime.of(2023, 10, 1, 14, 30, 0);
long hours = ChronoUnit.HOURS.between(start, end);
System.out.println(hours); // 输出 4
}
}
ZonedDateTime 处理带时区的时间
当涉及不同时区或需要处理夏令时切换时,应使用
ZonedDateTime</code。它基于具体的时区 ID 进行计算,能准确反映实际流逝的小时数,避免因时区偏移导致的计算错误。</p><div class="aritcle_card flexRow">
<div class="artcardd flexRow">
<a class="aritcle_card_img" href="/xiazai/skill12835" title="JavaScript 测试模式"><img
src="https://img.php.cn/upload/skill/001/246/273/6adaf20cf0281539.jpg" alt="JavaScript 测试模式" ></a>
<div class="aritcle_card_info flexColumn">
<a href="/xiazai/skill12835" title="JavaScript 测试模式">JavaScript 测试模式</a>
<p>使用 Jest、Vitest 和 Testing Library 实施全面的测试策略,包括单元测试、集成测试和端到端测试,涵盖模拟、测试夹具和测试驱动开发。在编</p>
</div>
<a href="/xiazai/skill12835" title="JavaScript 测试模式" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a>
</div>
</div><p><span>立即学习</span>“<a href="https://pan.quark.cn/s/c1c2c2ed740f" style="text-decoration: underline !important; color: blue; font-weight: bolder;" rel="nofollow" target="_blank">Java免费学习笔记(深入)</a>”;</p><p><img src="https://img.php.cn/upload/article/001/242/473/179463024175702.png" alt="Java 日期时间API怎么计算两个时间的间隔小时数"></p>
<pre class="brush:php;toolbar:false;">import java.time.ZonedDateTime;
import java.time.temporal.ChronoUnit;
import java.time.ZoneId;
public class Main {
public static void main(String[] args) {
ZonedDateTime start = ZonedDateTime.of(2023, 10, 1, 10, 0, 0, 0, ZoneId.of("Asia/Shanghai"));
ZonedDateTime end = ZonedDateTime.of(2023, 10, 1, 14, 30, 0, 0, ZoneId.of("Asia/Shanghai"));
long hours = ChronoUnit.HOURS.between(start, end);
System.out.println(hours); // 输出 4
}
}
负数结果与顺序问题
如果结束时间早于开始时间,between 方法会返回负数。这符合数学逻辑,表示时间倒流。开发者在业务逻辑中需根据需求决定是取绝对值还是保留符号以判断先后关系。

















