Java日期时区
ZoneOffset
表示与UTC时区偏移的固定区域。
ZoneOffset
不跟踪由夏令时导致的区域偏移的更改。
ZoneOffset类声明三个常量:
- UTC
- MAX
- MIN
UTC是UTC的时区偏移常量。
MAX和MIN是最大和最小支持的区域偏移。
Z用作UtC时区的区域偏移指示符。
我们可以用小时,分钟和秒的组合创建 ZoneOffset
。
import java.time.ZoneOffset; public class Main { public static void main(String[] args) { ZoneOffset zoneOffset1 = ZoneOffset.ofHours(-1); System.out.println(zoneOffset1); ZoneOffset zoneOffset2 = ZoneOffset.ofHoursMinutes(6, 30); System.out.println(zoneOffset2); ZoneOffset zoneOffset3 = ZoneOffset.ofHoursMinutesSeconds(9, 30, 45); System.out.println(zoneOffset3); } }
上面的代码生成以下结果。
例2
以下代码显示如何从偏移创建区域偏移。
import java.time.ZoneOffset; public class Main { public static void main(String[] args) { ZoneOffset zoneOffset1 = ZoneOffset.of("+05:00"); ZoneOffset zoneOffset2 = ZoneOffset.of("Z"); // Same as ZoneOffset.UTC System.out.println(zoneOffset1); System.out.println(zoneOffset2); } }
上面的代码生成以下结果。
例3
以下代码从 ZoneOffset
输出常量值。
import java.time.ZoneOffset; public class Main { public static void main(String[] args) { System.out.println("ZoneOffset.UTC: " + ZoneOffset.UTC); System.out.println("ZoneOffset.MIN: " + ZoneOffset.MIN); System.out.println("ZoneOffset.MAX: " + ZoneOffset.MAX); } }
上面的代码生成以下结果。
注意
Java Date-Time API支持以小时,分钟和秒为单位的区域偏移量。
来自ZoneOffset的compareTo()允许我们比较两个区域偏移。
+1:30的区域偏移在+1:00的区域偏移之前。
Java Date-Time API支持-18:00到+18:00之间的区域偏移。
ZoneId
ZoneId
表示区域偏移及其用于更改区域偏移的规则夏令时。
ZoneOffset
表示从UtC时区偏移的固定区域,而 ZoneId
表示可变区偏移。
这些更改是由时区规则定义的。
时区ID
每个时区都有一个ID,可以用三种格式定义:
- 在区域偏移中,可以是“Z”,“+ hh:mm:ss”或“-hh:mm:ss”,例如“+01:00”。
- 前缀为“UTC”,“GMT”或“UT”,后跟区域偏移量,例如“UTC + 01:00”。
- 在区域名称中,例如,“美洲/芝加哥”。
以下代码显示如何使用of()工厂方法创建ZoneId。
import java.time.ZoneId; public class Main { public static void main(String[] args) { ZoneId usChicago = ZoneId.of("America/Chicago"); System.out.println(usChicago); ZoneId fixedZoneId = ZoneId.of("+01:00"); System.out.println(fixedZoneId); } }
上面的代码生成以下结果。
例4
ZoneId
中的 getAvailableZoneIds()
返回所有已知时区ID。
import java.time.ZoneId; import java.util.Set; public class Main { public static void main(String[] args) { Set<String> zoneIds = ZoneId.getAvailableZoneIds(); for (String zoneId: zoneIds) { System.out.println(zoneId); } } }
上面的代码生成以下结果。
ZoneRules
ZoneRules
跟踪区域偏移如何变化。
下面的代码显示了如何使用 ZoneRules
以获取有关ZoneId的时间偏移和时间更改的信息。
import java.time.LocalDateTime; import java.time.ZoneId; import java.time.ZoneOffset; import java.time.zone.ZoneOffsetTransition; import java.time.zone.ZoneRules; import java.util.List; public class Main { public static void main(String[] args) { LocalDateTime now = LocalDateTime.now(); ZoneId usChicago = ZoneId.of("America/Chicago"); System.out.println("Zone ID: " + usChicago.getId()); ZoneRules rules = usChicago.getRules(); System.out.println("isFixedOffset(): " + rules.isFixedOffset()); ZoneOffset offset = rules.getOffset(now); System.out.println("Zone offset: " + offset); List<ZoneOffsetTransition> transitions = rules.getTransitions(); System.out.println(transitions); } }
上面的代码生成以下结果。