在 Java 中,将 MM/dd/yyyy HH:mm:ss 格式的日期时间字符串转换为 yyyy-MM-dd HH:mm:ss 格式,
可以使用以下两种方法(分别针对 Java 8+ 和旧版本):
方法 1:使用 java.time 包(Java 8+ 推荐)
代码示例
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class DateFormatConverter {
public static void main(String[] args) {
// 原始格式
String inputDate = "07/15/2024 14:30:45";
// 定义输入和输出的格式化器
DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern("MM/dd/yyyy HH:mm:ss");
DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
// 解析原始字符串为 LocalDateTime
LocalDateTime dateTime = LocalDateTime.parse(inputDate, inputFormatter);
// 格式化为目标字符串
String outputDate = dateTime.format(outputFormatter);
System.out.println("转换结果: " + outputDate);
// 输出: 2024-07-15 14:30:45
}
}
特点
- 线程安全:
DateTimeFormatter是线程安全的,可全局共享。 - 简洁性:代码直观,无需处理
Date或Calendar的复杂性。
方法 2:使用 SimpleDateFormat(旧版 Java)
代码示例
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateFormatConverterLegacy {
public static void main(String[] args) {
// 原始格式
String inputDate = "07/15/2024 14:30:45";
// 定义输入和输出的格式
SimpleDateFormat inputFormat = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
SimpleDateFormat outputFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
// 解析原始字符串为 Date
Date date = inputFormat.parse(inputDate);
// 格式化为目标字符串
String outputDate = outputFormat.format(date);
System.out.println("转换结果: " + outputDate);
// 输出: 2024-07-15 14:30:45
} catch (ParseException e) {
e.printStackTrace();
}
}
}
特点
- 线程不安全:
SimpleDateFormat实例不能在多线程中共享。 - 兼容性:适用于 Java 7 及更低版本。
关键注意事项
1. 格式符号的严格匹配
- 确保输入字符串与模式完全匹配(如分隔符
/和-需保持一致)。 - 例如,输入
07-15-2024 14:30:45(分隔符为-)与模式MM/dd/yyyy不匹配,会解析失败。
2. 异常处理
-
解析时需捕获
DateTimeParseException(Java 8+)或ParseException(旧版本)。 -
示例(Java 8+):
try { LocalDateTime dateTime = LocalDateTime.parse(inputDate, inputFormatter); } catch (DateTimeParseException e) { System.err.println("日期格式错误: " + e.getMessage()); }
3. 时区问题
-
若输入字符串包含时区信息(如
MM/dd/yyyy HH:mm:ss z),需使用ZonedDateTime替代LocalDateTime。 -
示例:
String inputDate = "07/15/2024 14:30:45 CST"; DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern("MM/dd/yyyy HH:mm:ss z"); ZonedDateTime zonedDateTime = ZonedDateTime.parse(inputDate, inputFormatter);
4. 性能优化(高频调用场景)
-
java.time:可复用DateTimeFormatter实例(线程安全)。 -
SimpleDateFormat:避免重复创建实例,需通过ThreadLocal包装解决线程安全问题:private static final ThreadLocal<SimpleDateFormat> inputFormat = ThreadLocal.withInitial(() -> new SimpleDateFormat("MM/dd/yyyy HH:mm:ss")); // 使用方式 Date date = inputFormat.get().parse(inputDate);
常见问题
Q1:输入字符串的月份或日期为单数字(如 7/5/2024)能否解析?
- 可以:
MM和dd模式支持单数字输入(如7会解析为07),但输出时会自动补零(如2024-07-05)。
Q2:如何处理 12 小时制时间?
-
若输入是
MM/dd/yyyy hh:mm:ss a(如07/15/2024 02:30:45 PM),需调整模式:DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern("MM/dd/yyyy hh:mm:ss a");
总结
| 场景 | 推荐方法 | 线程安全 | 代码示例 |
|---|---|---|---|
| Java 8+ 项目 | java.time | ✅ | LocalDateTime + DateTimeFormatter |
| 旧版 Java(≤7) | SimpleDateFormat | ❌(需封装) | SimpleDateFormat + Date |
优先使用 java.time 方案,避免遗留类的线程安全问题,并保持代码简洁。

被折叠的 条评论
为什么被折叠?



