Java DateTimeException 类
最后修改时间:2025 年 4 月 16 日
java.time.DateTimeException
是一个运行时异常,在日期时间操作失败时抛出。它表示无效的日期、时间或时区数据。这个异常是未经检查的,这意味着它不需要在 throws 中声明。
DateTimeException
扩展自 RuntimeException
。它在整个 java.time 包中使用。常见情况包括无效的日期值、不支持的字段和解析错误。该异常提供了详细的消息。
DateTimeException 类概述
DateTimeException
由 java.time API 中的方法抛出。它取代了旧的 IllegalArgumentException
用于日期时间问题。该类有助于识别时间数据中的特定问题。
public class DateTimeException extends RuntimeException { public DateTimeException(String message); public DateTimeException(String message, Throwable cause); }
代码展示了 DateTimeException 类的结构。它提供了标准的异常构造函数。消息描述了错误,而 cause 跟踪潜在的异常。这有助于调试时间问题。
无效日期示例
此示例演示了在创建无效日期时 DateTimeException 的使用。当日期超过月份的最大天数时,LocalDate 类会抛出它。
package com.zetcode; import java.time.LocalDate; public class Main { public static void main(String[] args) { try { // February 30 doesn't exist LocalDate invalidDate = LocalDate.of(2025, 2, 30); System.out.println("Created date: " + invalidDate); } catch (DateTimeException e) { System.out.println("Error: " + e.getMessage()); } } }
代码尝试创建 2 月 30 日,这是无效的。DateTimeException 被抛出,并附带关于无效日值的消息。catch 块优雅地处理了异常。
无效时间示例
此示例展示了无效时间值的 DateTimeException。当小时超过 23 或分钟超过 59 时,LocalTime 会抛出它。
package com.zetcode; import java.time.LocalTime; public class Main { public static void main(String[] args) { try { // 25:00 is not a valid time LocalTime invalidTime = LocalTime.of(25, 0); System.out.println("Created time: " + invalidTime); } catch (DateTimeException e) { System.out.println("Error: " + e.getMessage()); } } }
代码尝试创建一个 25:00 的时间,这不存在。DateTimeException 被抛出,并附带关于无效小时值的详细信息。该异常阻止了创建无效时间对象。
解析错误示例
当解析格式错误的日期时间字符串时,会发生 DateTimeException。当输入与预期格式不匹配时,parse 方法会抛出它。
package com.zetcode; import java.time.LocalDateTime; public class Main { public static void main(String[] args) { try { // Missing time component LocalDateTime parsed = LocalDateTime.parse("2025-04-16"); System.out.println("Parsed datetime: " + parsed); } catch (DateTimeException e) { System.out.println("Parse error: " + e.getMessage()); } } }
代码尝试解析一个不完整的日期时间字符串。DateTimeException 被抛出,因为字符串缺少所需的时间信息。消息表明无法解析文本。
不支持的字段示例
使用不支持的时间字段时,会抛出 DateTimeException。每个日期时间类仅支持特定字段。
package com.zetcode; import java.time.LocalTime; import java.time.temporal.ChronoField; public class Main { public static void main(String[] args) { try { LocalTime time = LocalTime.now(); // DayOfMonth not supported for LocalTime int day = time.get(ChronoField.DAY_OF_MONTH); System.out.println("Day: " + day); } catch (DateTimeException e) { System.out.println("Field error: " + e.getMessage()); } } }
代码尝试从 LocalTime 对象获取 day-of-month。DateTimeException 被抛出,因为时间对象不支持日期字段。消息表明不支持的字段。
时区示例
使用无效时区操作时,会发生 DateTimeException。此示例在使用无效的时区偏移值时显示它。
package com.zetcode; import java.time.ZoneOffset; public class Main { public static void main(String[] args) { try { // Offset exceeds maximum (+18:00) ZoneOffset invalidOffset = ZoneOffset.ofHours(20); System.out.println("Offset: " + invalidOffset); } catch (DateTimeException e) { System.out.println("Zone error: " + e.getMessage()); } } }
代码尝试创建 +20 小时的时区偏移量。DateTimeException 被抛出,因为偏移量必须在 -18 到 +18 之间。消息解释了有效范围。
持续时间计算示例
在持续时间计算期间可能发生 DateTimeException。当操作超出支持范围时,就会发生这种情况。
package com.zetcode; import java.time.Duration; import java.time.LocalTime; public class Main { public static void main(String[] args) { try { LocalTime start = LocalTime.of(23, 0); LocalTime end = LocalTime.of(1, 0); // Fails because duration would cross midnight Duration duration = Duration.between(start, end); System.out.println("Duration: " + duration); } catch (DateTimeException e) { System.out.println("Duration error: " + e.getMessage()); } } }
代码计算跨午夜的时间之间的持续时间。DateTimeException 被抛出,因为 LocalTime 无法表示超过 24 小时的持续时间。消息表明了计算的限制。
自定义 DateTimeException 示例
此示例展示了如何在自定义日期时间逻辑中抛出 DateTimeException。它对于验证业务规则很有用。
package com.zetcode; import java.time.DateTimeException; import java.time.LocalDate; public class Main { public static void main(String[] args) { try { validateFutureDate(LocalDate.of(2020, 1, 1)); } catch (DateTimeException e) { System.out.println("Validation failed: " + e.getMessage()); } } static void validateFutureDate(LocalDate date) { if (date.isBefore(LocalDate.now())) { throw new DateTimeException("Date must be in the future"); } System.out.println("Valid future date: " + date); } }
代码验证日期是否在未来。它为过去日期抛出 DateTimeException。这演示了该异常在业务规则中的自定义使用。
来源
本教程通过实际示例涵盖了 DateTimeException。该异常有助于一致地处理日期时间错误。理解它是在 Java 中进行可靠的时间操作的关键。
作者
列出所有Java教程。