ZoneOffset.ofHours() 是 Java 中创建固定小时偏移量时区偏移最直接的方式,接收 int 类型小时数(−18 至 +18),返回对应 ZoneOffset 实例;超出范围抛 DateTimeException;带分钟偏移需用 ofHoursMinutes() 或 of(String)。

ZoneOffset.ofHours() 是 Java 中创建固定小时偏移量时区偏移(即不带分钟偏移的 UTC 偏移)最直接的方式。
用法很简单:传入整数小时数
该方法接收一个 int 类型的小时数,返回对应的 ZoneOffset 实例。正数表示东八区这类 UTC+8,负数表示西五区这类 UTC−5。
-
ZoneOffset.ofHours(8)→UTC+08:00 -
ZoneOffset.ofHours(-5)→UTC-05:00 -
ZoneOffset.ofHours(0)→UTC+00:00(等价于ZoneOffset.UTC)
注意范围限制
Java 对合法偏移做了校验:只接受 −18 到 +18 之间的整数(含边界)。超出会抛出 DateTimeException。
- ✅
ZoneOffset.ofHours(18)合法(极少数地区如新西兰查塔姆群岛曾用 +13:45,但整点偏移最大支持到 +18) - ❌
ZoneOffset.ofHours(20)会报错
如果需要带分钟的偏移(比如 UTC+05:30),不能用 ofHours
这时得用 ZoneOffset.ofHoursMinutes() 或更通用的 ZoneOffset.of(String):
立即学习“Java免费学习笔记(深入)”;
-
ZoneOffset.ofHoursMinutes(5, 30)→UTC+05:30 -
ZoneOffset.of("+05:30")→ 效果相同,字符串格式更灵活
常见误用提醒
别把 ZoneId.of("GMT+8") 或 TimeZone.getTimeZone("GMT+8") 和 ZoneOffset 混用——前者是带规则的时区 ID(可能含夏令时),后者是纯固定偏移,无任何规则。
- 要表示“固定比 UTC 快 8 小时”,用
ZoneOffset.ofHours(8)最准确 - 要表示“亚洲上海时间”(含 DST 变化),才该用
ZoneId.of("Asia/Shanghai")


















