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教程。