java.text.ParseException: Unparseable date

在 Java 编程中,java.text.ParseException: Unparseable date 是一个常见的异常,通常在尝试将字符串转换为日期对象时发生。这个异常意味着输入的日期字符串与预期的日期格式不匹配,导致 SimpleDateFormat 或其他日期解析类无法正确解析日期。本文将详细介绍 ParseException 异常的原因、解决方法和相关的日期处理技巧。

1. ParseException 异常概述

ParseExceptionjava.text 包中的一个检查性异常,表示在解析字符串时发生了错误。它通常在使用 DateFormatSimpleDateFormat 进行日期解析时抛出。

示例异常信息

plaintext
java.text.ParseException: Unparseable date: "2024-07-17"

2. 常见的 Unparseable date 异常原因

2.1 日期字符串与格式不匹配

问题:提供的日期字符串与指定的日期格式不匹配。

解决方案: 确保日期字符串与 SimpleDateFormat 中指定的格式完全匹配。例如,字符串 "2024-07-17" 需要使用 yyyy-MM-dd 格式进行解析。

示例代码

java
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class DateParseExample { public static void main(String[] args) { String dateString = "2024-07-17"; SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); try { Date date = formatter.parse(dateString); System.out.println("Parsed date: " + date); } catch (ParseException e) { System.out.println("Error parsing date: " + e.getMessage()); } } }

2.2 日期格式包含不合法的部分

问题:日期格式中包含了错误或不合法的部分,如不正确的日期、月份或年份。

解决方案: 验证日期字符串中的日期、月份和年份是否有效。

示例代码

java
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class InvalidDateExample { public static void main(String[] args) { String dateString = "2024-13-17"; // Invalid month SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); formatter.setLenient(false); // Disable lenient parsing try { Date date = formatter.parse(dateString); System.out.println("Parsed date: " + date); } catch (ParseException e) { System.out.println("Error parsing date: " + e.getMessage()); } } }

2.3 不正确的时区或本地化设置

问题:日期字符串与指定的时区或本地化设置不匹配。

解决方案: 确保使用正确的 LocaleTimeZone

示例代码

java
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; import java.util.TimeZone; public class LocaleTimeZoneExample { public static void main(String[] args) { String dateString = "17-Jul-2024"; SimpleDateFormat formatter = new SimpleDateFormat("dd-MMM-yyyy", Locale.ENGLISH); formatter.setTimeZone(TimeZone.getTimeZone("UTC")); try { Date date = formatter.parse(dateString); System.out.println("Parsed date: " + date); } catch (ParseException e) { System.out.println("Error parsing date: " + e.getMessage()); } } }

3. 常用日期格式示例

以下是一些常见的日期格式和相应的 SimpleDateFormat 模式字符串:

日期格式模式字符串示例日期
年-月-日yyyy-MM-dd2024-07-17
日/月/年dd/MM/yyyy17/07/2024
月/日/年MM/dd/yyyy07/17/2024
年-月-日 小时:分钟:秒yyyy-MM-dd HH:mm:ss2024-07-17 14:30:00
月 日, 年MMMM d, yyyyJuly 17, 2024
星期 日 月 年E dd MMM yyyyWed 17 Jul 2024

4. 设置 SimpleDateFormat 的解析选项

4.1 禁用宽松模式

默认情况下,SimpleDateFormat 的解析是宽松的,这意味着它可能会解析不完全正确的日期。通过设置 setLenient(false),你可以强制 SimpleDateFormat 严格遵守日期格式。

示例代码

java
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); formatter.setLenient(false); // 禁用宽松解析模式

4.2 设置 Locale 和 TimeZone

示例代码

java
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH); formatter.setTimeZone(TimeZone.getTimeZone("UTC")); // 设置时区

5. 处理不同的日期时间格式

使用 DateTimeFormatter 是 Java 8 及以后的推荐方法,提供了更丰富的日期时间处理功能。

示例代码

java
import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; public class DateTimeFormatterExample { public static void main(String[] args) { String dateString = "2024-07-17"; DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); try { LocalDate date = LocalDate.parse(dateString, formatter); System.out.println("Parsed date: " + date); } catch (DateTimeParseException e) { System.out.println("Error parsing date: " + e.getMessage()); } } }

6. 处理 DateTimeParseException(Java 8+)

DateTimeParseException 是 Java 8 及以后的版本中使用 DateTimeFormatter 进行日期时间解析时抛出的异常。

示例代码

java
import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; public class DateTimeParseExceptionExample { public static void main(String[] args) { String dateString = "2024-07-32"; // Invalid date DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); try { LocalDate date = LocalDate.parse(dateString, formatter); System.out.println("Parsed date: " + date); } catch (DateTimeParseException e) { System.out.println("Error parsing date: " + e.getMessage()); } } }

7. 实用工具和库

在实际应用中,可能需要使用一些第三方库来简化日期和时间的处理。

  • Joda-Time:提供了比 java.util.Datejava.text.SimpleDateFormat 更强大和灵活的日期时间 API。
  • **