在 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
方案,避免遗留类的线程安全问题,并保持代码简洁。