Java ZoneOffsetTransitionRule 类
最后修改时间:2025 年 4 月 16 日
java.time.zone.ZoneOffsetTransitionRule
类定义了时区转换的规则。它指定了夏令时在特定时区内如何变化。该类是不可变的且线程安全的。
ZoneOffsetTransitionRule
与其他时间类一起处理时区转换。它定义了转换何时发生以及转换前后适用的偏移量。这些规则通常由 ZoneRules
使用。
ZoneOffsetTransitionRule 类概述
ZoneOffsetTransitionRule
提供了创建和查询转换规则的方法。关键操作包括获取转换详细信息和计算确切的转换日期。该类处理复杂的转换规则。
public final class ZoneOffsetTransitionRule implements Serializable { public static ZoneOffsetTransitionRule of( Month month, int dayOfMonthIndicator, DayOfWeek dayOfWeek, LocalTime time, boolean timeEndOfDay, TimeDefinition timeDefinition, ZoneOffset standardOffset, ZoneOffset offsetBefore, ZoneOffset offsetAfter); public ZoneOffsetTransition createTransition(int year); public Month getMonth(); public int getDayOfMonthIndicator(); public DayOfWeek getDayOfWeek(); public LocalTime getLocalTime(); public boolean isMidnightEndOfDay(); public TimeDefinition getTimeDefinition(); public ZoneOffset getStandardOffset(); public ZoneOffset getOffsetBefore(); public ZoneOffset getOffsetAfter(); }
以上代码显示了 ZoneOffsetTransitionRule
提供的关键方法。这些方法允许创建和查询转换规则。该类处理复杂情况,例如三月的最后一个星期日或特定日期后的第一个星期日。
创建基本转换规则
此示例演示了如何创建简单的夏令时转换规则。该规则定义了在 3 月 31 日当地时间 01:00 发生的转换。
package com.zetcode; import java.time.*; import java.time.zone.*; public class Main { public static void main(String[] args) { ZoneOffsetTransitionRule rule = ZoneOffsetTransitionRule.of( Month.MARCH, 31, null, LocalTime.of(1, 0), false, TimeDefinition.WALL, ZoneOffset.ofHours(1), ZoneOffset.ofHours(1), ZoneOffset.ofHours(2)); System.out.println("Transition rule: " + rule); // Create transition for specific year ZoneOffsetTransition transition = rule.createTransition(2025); System.out.println("Transition in 2025: " + transition); } }
此示例创建了 3 月 31 日凌晨 1 点的转换规则。时间定义为 WALL,表示当地时钟时间。偏移量从 +01:00 变为 +02:00。
创建最后一个星期日规则
此示例演示了如何为一个月中的最后一个星期日创建规则。这种模式在许多国家/地区的夏令时转换中很常见。
package com.zetcode; import java.time.*; import java.time.zone.*; public class Main { public static void main(String[] args) { ZoneOffsetTransitionRule rule = ZoneOffsetTransitionRule.of( Month.OCTOBER, -1, DayOfWeek.SUNDAY, LocalTime.of(2, 0), false, TimeDefinition.WALL, ZoneOffset.ofHours(1), ZoneOffset.ofHours(2), ZoneOffset.ofHours(1)); System.out.println("Last Sunday rule: " + rule); // Calculate transition for 2025 ZoneOffsetTransition transition = rule.createTransition(2025); System.out.println("Transition in 2025: " + transition); System.out.println("Transition date: " + transition.getDateTime()); } }
此规则指定 10 月最后一个星期日凌晨 2 点。dayOfMonthIndicator 为 -1,表示最后一次出现。偏移量从 +02:00 变回 +01:00。
特定日期后的第一个星期日
此示例展示了如何为特定日期后的第一个星期日创建规则。这种模式被某些时区用于夏令时转换。
package com.zetcode; import java.time.*; import java.time.zone.*; public class Main { public static void main(String[] args) { ZoneOffsetTransitionRule rule = ZoneOffsetTransitionRule.of( Month.MARCH, 8, DayOfWeek.SUNDAY, LocalTime.of(2, 0), false, TimeDefinition.WALL, ZoneOffset.ofHours(-5), ZoneOffset.ofHours(-5), ZoneOffset.ofHours(-4)); System.out.println("First Sunday after March 8 rule: " + rule); // Calculate transitions for multiple years for (int year = 2023; year <= 2025; year++) { ZoneOffsetTransition transition = rule.createTransition(year); System.out.println(year + " transition: " + transition.getDateTime()); } } }
此规则定义了 3 月 8 日之后的第一个星期日凌晨 2 点。偏移量从 -05:00 变为 -04:00。该示例显示了多年来的转换。
使用不同的时间定义
此示例演示了三种不同的时间定义类型:WALL、STANDARD 和 UTC。每种类型都会影响转换时间的解释方式。
package com.zetcode; import java.time.*; import java.time.zone.*; public class Main { public static void main(String[] args) { // WALL time (local clock time) ZoneOffsetTransitionRule wallRule = ZoneOffsetTransitionRule.of( Month.APRIL, 1, null, LocalTime.of(1, 30), false, TimeDefinition.WALL, ZoneOffset.ofHours(2), ZoneOffset.ofHours(2), ZoneOffset.ofHours(3)); // STANDARD time (standard offset time) ZoneOffsetTransitionRule standardRule = ZoneOffsetTransitionRule.of( Month.APRIL, 1, null, LocalTime.of(1, 30), false, TimeDefinition.STANDARD, ZoneOffset.ofHours(2), ZoneOffset.ofHours(2), ZoneOffset.ofHours(3)); // UTC time ZoneOffsetTransitionRule utcRule = ZoneOffsetTransitionRule.of( Month.APRIL, 1, null, LocalTime.of(1, 30), false, TimeDefinition.UTC, ZoneOffset.ofHours(2), ZoneOffset.ofHours(2), ZoneOffset.ofHours(3)); System.out.println("WALL transition: " + wallRule.createTransition(2025)); System.out.println("STANDARD transition: " + standardRule.createTransition(2025)); System.out.println("UTC transition: " + utcRule.createTransition(2025)); } }
此示例显示了不同的时间定义如何影响实际转换。WALL 使用当地时间,STANDARD 使用标准偏移时间,而 UTC 使用 UTC。
午夜结束日转换
此示例演示了在一天结束时午夜发生的转换。这需要特殊处理,因为午夜可能存在歧义。
package com.zetcode; import java.time.*; import java.time.zone.*; public class Main { public static void main(String[] args) { ZoneOffsetTransitionRule rule = ZoneOffsetTransitionRule.of( Month.DECEMBER, 31, null, LocalTime.MIDNIGHT, true, TimeDefinition.WALL, ZoneOffset.ofHours(1), ZoneOffset.ofHours(1), ZoneOffset.ofHours(0)); System.out.println("End-of-day rule: " + rule); ZoneOffsetTransition transition = rule.createTransition(2025); System.out.println("Transition: " + transition); System.out.println("Instant: " + transition.getInstant()); System.out.println("DateTimeBefore: " + transition.getDateTimeBefore()); System.out.println("DateTimeAfter: " + transition.getDateTimeAfter()); } }
此规则定义了在 12 月 31 日结束时的午夜发生的转换。timeEndOfDay 参数设置为 true。偏移量从 +01:00 变为 +00:00。
复杂转换规则
此示例结合了多个功能来创建复杂的转换规则。它使用星期几、时间定义和不同的偏移量。
package com.zetcode; import java.time.*; import java.time.zone.*; public class Main { public static void main(String[] args) { ZoneOffsetTransitionRule rule = ZoneOffsetTransitionRule.of( Month.MARCH, 15, DayOfWeek.SATURDAY, LocalTime.of(1, 30), false, TimeDefinition.STANDARD, ZoneOffset.ofHours(-8), ZoneOffset.ofHours(-8), ZoneOffset.ofHours(-7)); System.out.println("Complex rule: " + rule); // Show transitions for next 5 years for (int year = 2025; year <= 2029; year++) { ZoneOffsetTransition transition = rule.createTransition(year); System.out.printf("%d: %s (day %d)%n", year, transition.getDateTime(), transition.getDateTime().getDayOfMonth()); } } }
此规则定义了在 3 月 15 日后的第一个星期六凌晨 1:30 标准时间进行的转换。偏移量从 -08:00 变为 -07:00。该示例显示了多年来的确切日期。
查询转换规则属性
此示例演示了如何查询转换规则的各种属性。可以单独检查规则的所有组件。
package com.zetcode; import java.time.*; import java.time.zone.*; public class Main { public static void main(String[] args) { ZoneOffsetTransitionRule rule = ZoneOffsetTransitionRule.of( Month.APRIL, 10, DayOfWeek.SUNDAY, LocalTime.of(2, 0), false, TimeDefinition.WALL, ZoneOffset.ofHours(3), ZoneOffset.ofHours(3), ZoneOffset.ofHours(4)); System.out.println("Month: " + rule.getMonth()); System.out.println("Day of month indicator: " + rule.getDayOfMonthIndicator()); System.out.println("Day of week: " + rule.getDayOfWeek()); System.out.println("Local time: " + rule.getLocalTime()); System.out.println("Time definition: " + rule.getTimeDefinition()); System.out.println("Standard offset: " + rule.getStandardOffset()); System.out.println("Offset before: " + rule.getOffsetBefore()); System.out.println("Offset after: " + rule.getOffsetAfter()); System.out.println("Is midnight end of day: " + rule.isMidnightEndOfDay()); } }
此示例演示了如何检查转换规则的所有属性。可以通过 getter 方法访问规则的每个组件。这对于分析或显示规则详细信息很有用。
来源
Java ZoneOffsetTransitionRule 类文档
在本文中,我们介绍了 Java ZoneOffsetTransitionRule 类的基本方法和功能。理解这些概念对于在 Java 应用程序中处理时区转换至关重要。
作者
列出所有Java教程。