Java ZoneOffset 类
最后修改时间:2025 年 4 月 16 日
java.time.ZoneOffset 类表示 UTC/格林威治时间的固定时区偏移量。 它用于处理时区在小时、分钟和秒上的差异。 ZoneOffset 是不可变的且线程安全的。
ZoneOffset 通常与 OffsetDateTime 等其他日期时间类一起使用。 它支持从 +18:00 到 -18:00 的偏移量。 该类为常见的偏移量(如 UTC)提供了常量。
ZoneOffset 类概述
ZoneOffset 提供了创建和操作固定时区偏移量的方法。 关键操作包括解析字符串、比较偏移量以及获取总偏移秒数。 该类处理夏令时转换。
public final class ZoneOffset implements ZoneId, TemporalAccessor,
TemporalAdjuster, Comparable<ZoneOffset>, Serializable {
public static final ZoneOffset UTC;
public static ZoneOffset of(String offsetId);
public static ZoneOffset ofHours(int hours);
public static ZoneOffset ofHoursMinutes(int hours, int minutes);
public static ZoneOffset ofHoursMinutesSeconds(int hours, int minutes, int seconds);
public static ZoneOffset ofTotalSeconds(int totalSeconds);
public int getTotalSeconds();
public String getId();
public boolean equals(Object obj);
}
上面的代码显示了 ZoneOffset 提供的关键方法。 这些方法允许创建和使用固定时区偏移量。 UTC 常量表示与格林威治时间的零偏移量。
创建 ZoneOffset 对象
可以通过多种方式创建 ZoneOffset 对象。 最常用的方法是 of 用于字符串解析,以及用于特定偏移量的工厂方法。 UTC 常量也可用。
package com.zetcode;
import java.time.ZoneOffset;
public class Main {
public static void main(String[] args) {
// UTC constant
ZoneOffset utc = ZoneOffset.UTC;
System.out.println("UTC offset: " + utc);
// From string
ZoneOffset offset1 = ZoneOffset.of("+02:00");
System.out.println("+02:00 offset: " + offset1);
// From hours
ZoneOffset offset2 = ZoneOffset.ofHours(5);
System.out.println("+05:00 offset: " + offset2);
// From hours and minutes
ZoneOffset offset3 = ZoneOffset.ofHoursMinutes(5, 30);
System.out.println("+05:30 offset: " + offset3);
// From total seconds
ZoneOffset offset4 = ZoneOffset.ofTotalSeconds(3600);
System.out.println("+01:00 offset (from seconds): " + offset4);
}
}
此示例演示了创建 ZoneOffset 对象的不同方法。 输出显示了各种时区偏移量。 请注意,字符串格式必须遵循 ISO-8601 时区指示符模式。
获取偏移信息
ZoneOffset 可以提供以秒为单位的总偏移量及其字符串 ID。 这些值对于计算和显示目的非常有用。 这些方法提供了对偏移量基本属性的访问。
package com.zetcode;
import java.time.ZoneOffset;
public class Main {
public static void main(String[] args) {
ZoneOffset offset = ZoneOffset.of("+05:30");
// Get total offset in seconds
int totalSeconds = offset.getTotalSeconds();
System.out.println("Total seconds: " + totalSeconds);
// Get ID string
String id = offset.getId();
System.out.println("ID: " + id);
// Calculate hours and minutes
int hours = totalSeconds / 3600;
int minutes = (totalSeconds % 3600) / 60;
System.out.printf("Human-readable: %+02d:%02d%n", hours, minutes);
}
}
此示例显示了如何从 ZoneOffset 中提取信息。 getTotalSeconds 方法返回以秒为单位的完整偏移量。 ID 遵循 ISO-8601 格式的时区偏移量。
比较 ZoneOffset
可以比较 ZoneOffset 以确定它们相对于 UTC 的相对位置。 该类提供了 equals 和 compareTo 方法。 这些比较对于按时区排序或分组很有用。
package com.zetcode;
import java.time.ZoneOffset;
public class Main {
public static void main(String[] args) {
ZoneOffset offset1 = ZoneOffset.of("+02:00");
ZoneOffset offset2 = ZoneOffset.of("+05:30");
ZoneOffset offset3 = ZoneOffset.of("-03:00");
// Equality check
ZoneOffset sameOffset = ZoneOffset.ofHours(2);
System.out.println("Equals check: " + offset1.equals(sameOffset));
// Comparison
System.out.println("Compare +02:00 and +05:30: " +
offset1.compareTo(offset2));
System.out.println("Compare +02:00 and -03:00: " +
offset1.compareTo(offset3));
// Sorting example
System.out.println("Is +02:00 before +05:30? " +
(offset1.compareTo(offset2) < 0));
}
}
此示例演示了比较 ZoneOffset 对象的各种方法。 比较基于与 UTC 的总秒数。 请注意,相等的偏移量始终具有相同的字符串表示形式。
将 ZoneOffset 与其他类一起使用
ZoneOffset 通常与 OffsetDateTime 等其他日期时间类一起使用。 这些组合允许表示具有特定偏移量的日期时间值。 在 Java Time API 中,集成是无缝的。
package com.zetcode;
import java.time.OffsetDateTime;
import java.time.ZoneOffset;
import java.time.LocalDateTime;
public class Main {
public static void main(String[] args) {
ZoneOffset offset = ZoneOffset.of("+05:30");
// Create OffsetDateTime with offset
OffsetDateTime odt = OffsetDateTime.now(offset);
System.out.println("Current date-time with offset: " + odt);
// Convert LocalDateTime to OffsetDateTime
LocalDateTime ldt = LocalDateTime.now();
OffsetDateTime odt2 = ldt.atOffset(offset);
System.out.println("Local date-time with offset: " + odt2);
// Extract offset from OffsetDateTime
ZoneOffset extractedOffset = odt.getOffset();
System.out.println("Extracted offset: " + extractedOffset);
}
}
此示例显示了 ZoneOffset 如何与其他日期时间类一起工作。 atOffset 方法将偏移量附加到本地日期时间。 所有操作都保留了所表示的确切时间。
处理最大和最小偏移量
ZoneOffset 支持从 +18:00 到 -18:00 的偏移量。 尝试在此范围之外创建偏移量会引发异常。 该类验证所有输入值。
package com.zetcode;
import java.time.ZoneOffset;
public class Main {
public static void main(String[] args) {
// Maximum offset
ZoneOffset maxOffset = ZoneOffset.of("+18:00");
System.out.println("Maximum offset: " + maxOffset);
// Minimum offset
ZoneOffset minOffset = ZoneOffset.of("-18:00");
System.out.println("Minimum offset: " + minOffset);
try {
// Invalid offset (too large)
ZoneOffset invalid = ZoneOffset.of("+19:00");
} catch (Exception e) {
System.out.println("Caught exception: " + e.getMessage());
}
// Edge case in seconds
ZoneOffset edgeCase = ZoneOffset.ofTotalSeconds(18 * 3600);
System.out.println("Edge case offset: " + edgeCase);
}
}
此示例演示了 ZoneOffset 的有效范围。 该类严格执行 +18:00 到 -18:00 的限制。 所有工厂方法都执行此验证。
ZoneOffset vs ZoneId
ZoneOffset 与 ZoneId 的不同之处在于,它表示固定偏移量与完整的时区规则。 ZoneOffset 更简单,但不处理夏令时。 ZoneId 更灵活,但也更复杂。
package com.zetcode;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
public class Main {
public static void main(String[] args) {
// ZoneOffset example
ZoneOffset offset = ZoneOffset.of("+02:00");
System.out.println("Fixed offset: " + offset);
// ZoneId example
ZoneId zone = ZoneId.of("Europe/Paris");
System.out.println("Full time zone: " + zone);
// Both can be used with ZonedDateTime
ZonedDateTime zdt1 = ZonedDateTime.now(offset);
System.out.println("With offset: " + zdt1);
ZonedDateTime zdt2 = ZonedDateTime.now(zone);
System.out.println("With zone: " + zdt2);
// ZoneOffset is a ZoneId
System.out.println("Is ZoneOffset a ZoneId? " +
(offset instanceof ZoneId));
}
}
此示例比较了 ZoneOffset 和 ZoneId 的用法。 虽然两者都可以用作 ZoneId,但 ZoneOffset 仅提供固定偏移量。 ZoneId 处理夏令时和历史变化。
来源
在本文中,我们介绍了 Java ZoneOffset 类的基本方法和功能。 了解这些概念对于 Java 应用程序中的准确时区处理至关重要。
作者
列出所有Java教程。