下面我将详细介绍如何使用 java.time API 来完成这个任务,并提供不同场景下的代码示例。

核心概念
DateTimeFormatter: 这是将字符串解析为日期时间对象,或将日期时间对象格式化为字符串的关键,它定义了日期时间的格式模式。LocalDateTime: 表示一个不带时区的本地日期和时间(2025-10-27T10:15:30)。ZonedDateTime: 表示一个带有时区的日期时间(2025-10-27T10:15:30+08:00[Asia/Shanghai])。Instant: 表示时间线上的一个瞬时点,通常用于表示机器时间。
使用 LocalDateTime(最常用)
如果你的字符串不包含时区信息,或者你不需要关心时区,使用 LocalDateTime 是最合适的选择。
使用预定义的格式
DateTimeFormatter 提供了一些预定义的格式,用于处理常见的标准格式。
示例:解析 ISO 格式字符串(yyyy-MM-ddTHH:mm:ss)

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class StringToLocalDateTime {
public static void main(String[] args) {
String dateTimeStr = "2025-10-27T15:30:00";
// 预定义的 ISO_LOCAL_DATE_TIME 格式可以直接解析这种字符串
LocalDateTime dateTime = LocalDateTime.parse(dateTimeStr);
System.out.println("解析后的 LocalDateTime: " + dateTime);
// 输出: 解析后的 LocalDateTime: 2025-10-27T15:30
}
}
示例:解析其他常见格式
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class StringToLocalDateTimeExample {
public static void main(String[] args) {
// 情况1: 字符串格式为 "yyyy-MM-dd HH:mm:ss"
String str1 = "2025-10-27 15:30:00";
DateTimeFormatter formatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime dateTime1 = LocalDateTime.parse(str1, formatter1);
System.out.println("格式1: " + dateTime1); // 输出: 格式1: 2025-10-27T15:30
// 情况2: 字符串格式为 "yyyy/MM/dd HH:mm"
String str2 = "2025/10/27 15:30";
DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm");
LocalDateTime dateTime2 = LocalDateTime.parse(str2, formatter2);
System.out.println("格式2: " + dateTime2); // 输出: 格式2: 2025-10-27T15:30
// 情况3: 字符串格式为 "dd-MM-yyyy"
String str3 = "27-10-2025";
DateTimeFormatter formatter3 = DateTimeFormatter.ofPattern("dd-MM-yyyy");
LocalDateTime dateTime3 = LocalDateTime.parse(str3, formatter3);
System.out.println("格式3: " + dateTime3); // 输出: 格式3: 2025-10-27T00:00
}
}
DateTimeFormatter 常用模式字符:
| 符号 | 含义 | 示例 |
|---|---|---|
y |
年 | yyyy (2025), yy (23) |
M |
月 | MM (10), M (10) |
d |
月中的天 | dd (27), d (27) |
H |
小时 (0-23) | HH (15) |
h |
小时 (1-12) | hh (03) |
m |
分钟 | mm (30) |
s |
秒 | ss (00) |
S |
毫秒 | SSS (123) |
a |
上午/下午标记 | AM 或 PM |
T |
时间分隔符 | 用于 LocalDateTime 的 yyyy-MM-ddTHH:mm:ss 格式 |
使用 ZonedDateTime(处理时区)
如果你的字符串包含时区信息(如 +08:00 或 Asia/Shanghai),你应该使用 ZonedDateTime。

解析带时区偏移的字符串 (e.g., +08:00)
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
public StringToZonedDateTimeExample {
public static void main(String[] args) {
String dateTimeStrWithOffset = "2025-10-27T15:30:00+08:00";
// 使用 ISO_ZONED_DATE_TIME 格式自动解析
ZonedDateTime zonedDateTime = ZonedDateTime.parse(dateTimeStrWithOffset);
System.out.println("解析后的 ZonedDateTime: " + zonedDateTime);
// 输出: 解析后的 ZonedDateTime: 2025-10-27T15:30+08:00
}
}
解析带时区ID的字符串 (e.g., Asia/Shanghai)
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
public StringToZonedDateTimeExample2 {
public static void main(String[] args) {
String dateTimeStrWithZoneId = "2025-10-27T15:30:00 Asia/Shanghai";
// 需要自定义格式来解析时区ID
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss z");
ZonedDateTime zonedDateTime = ZonedDateTime.parse(dateTimeStrWithZoneId, formatter);
System.out.println("解析后的 ZonedDateTime: " + zonedDateTime);
// 输出: 解析后的 ZonedDateTime: 2025-10-27T15:30+08:00[Asia/Shanghai]
}
}
处理旧版 java.util.Date
如果你需要与一些遗留系统交互,这些系统仍在使用 java.util.Date,你可以进行转换。
String -> LocalDateTime -> Date
import java.time.*;
import java.util.Date;
public StringToDateExample {
public static void main(String[] args) {
String dateTimeStr = "2025-10-27T15:30:00";
// 1. String -> LocalDateTime
LocalDateTime localDateTime = LocalDateTime.parse(dateTimeStr);
// 2. LocalDateTime -> ZonedDateTime (指定一个时区,例如系统默认时区)
ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.systemDefault());
// 3. ZonedDateTime -> Instant
Instant instant = zonedDateTime.toInstant();
// 4. Instant -> Date
Date date = Date.from(instant);
System.out.println("原始字符串: " + dateTimeStr);
System.out.println("转换后的 java.util.Date: " + date);
}
}
完整示例与最佳实践
下面是一个综合示例,展示了如何处理各种格式,并处理可能的解析错误。
import java.time.*;
import java.time.format.*;
import java.util.*;
public StringParsingBestPractice {
public static void main(String[] args) {
// --- 场景1: 标准ISO格式,无需指定格式 ---
String isoStr = "2025-10-27T10:00:00";
LocalDateTime dt1 = LocalDateTime.parse(isoStr);
System.out.println("1. 解析ISO格式: " + dt1);
// --- 场景2: 自定义格式,必须指定格式 ---
String customStr = "27/10/2025 08:30 PM";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy hh:mm a");
try {
LocalDateTime dt2 = LocalDateTime.parse(customStr, formatter);
System.out.println("2. 解析自定义格式: " + dt2);
} catch (DateTimeParseException e) {
System.err.println("解析失败: " + e.getMessage());
}
// --- 场景3: 带时区信息的字符串 ---
String zonedStr = "2025-10-27T10:00:00[Europe/Paris]";
ZonedDateTime zdt1 = ZonedDateTime.parse(zonedStr);
System.out.println("3. 解析带时区ID: " + zdt1);
// --- 场景4: 从用户输入解析,并处理错误 ---
Scanner scanner = new Scanner(System.in);
System.out.print("\n请输入一个日期时间 (格式: yyyy-MM-dd HH:mm): ");
String userInput = scanner.nextLine();
try {
// 定义与用户输入相匹配的格式
